On Mon, Dec 09, 2013 at 12:45:37AM -0800, Walter Bright wrote: [...] > Try this: > > pure int foo (int a, int b) nothrow { > return a + b; > } > > int test() { > return foo(1, 2) + foo(1, 2); > } > > Compile with: > > dmd foo -O -release -c > > And dump the assembly: > > push EAX > mov EAX,2 > push 1 > call near ptr _D3foo3fooFNaNbiiZi > add EAX,EAX > pop ECX > ret > > Granted, more cases can be done, but it *does* take advantage of > purity here and there. [...]
Does this currently only happen inside a single expression? Any plans to have the optimizer recognize pure calls in separate (but identical) expressions? Jacob's example seems like it *should* be easily detected: int a = pureFunc(a,b,c); int b = pureFunc(a,b,c); // should elide this second call T -- The only difference between male factor and malefactor is just a little emptiness inside.