On 12/21/2016 03:04 PM, Johan Engelen wrote:
On Wednesday, 21 December 2016 at 15:40:42 UTC, Andrei Alexandrescu wrote:
On 12/20/2016 05:49 PM, Andrei Alexandrescu wrote:
https://github.com/dlang/dlang.org/pull/1528 -- Andrei

Dropped the void functions. On to the next scandal:

I think you should be very careful in making sure that `pure` does not
become a pessimization keyword.

```
$(P Any `pure` function that is not strongly pure cannot be memoized. The
     compiler is required to honor all calls to the function, even if it
appears
     to do nothing. (Example: a pure function taking no arguments and
returning
     `int*` cannot be memoized. It also should not because it may be a
typical
     factory function returning a fresh pointer with each call.))
```
I don't know what "required to honor all calls" means, but I guess it means
```
auto a = foo(); // int* foo() pure;
auto b = foo();
```
cannot be transformed to
```
auto a = foo(); // int* foo() pure;
auto b = a;
```

That is correct.

Super contrived, but I hope you get my drift:
```
int *awesome() pure {
  static if (ohSoAwesome) {
     return new int;
  } else {
     return null;
  }
}
```

Where does ohSoAwesome come from?

Tagging this function with `pure` would be a pessimization.

Not to worry. It's all up to what can be detected. If inlining is in effect then definitely things can be optimized appropriately.

Instead of
  "Any `pure` function that is not strongly pure cannot be memoized."
why not
  "Any `pure` function that is not strongly pure _may not be assumed to
be_ memoizable."

Got it. Good point. Will do.

Another example:
```
/// Note: need to mark this function as non-pure, because otherwise the
compiler deduces it as pure and then pessimizes our code.
int *bar(bool returnNull) nonpure {
  if (returnNull) {
     return null;
  } else {
     return new ...;
  }
}

auto a = bar(true);
auto b = bar(true);
auto c = bar(true);
```

My concern with the current wording (like for the void function thing)
is that it actively prohibits the compiler to do a transformation even
if that is valid.

Yah, we kind of assume without stating that whole "observable behavior" that C++ does.


Andrei


Reply via email to