<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div>On Sun, Mar 6, 2016, at 05:46 AM, Patrick Pijnappel wrote:<br></div>
<blockquote type="cite"><div>My intuition says the extra state &amp; branch needed for generators like TakeWhile&nbsp;could very well&nbsp;be optimized away in most cases if you dont make&nbsp;use of&nbsp;its post-nil behavior. Say TakeWhile is implemented as such:<br></div>
<div>&nbsp;</div>
<div>if done { return nil }<br></div>
<div>guard let element = base.next() where predicate(element)&nbsp;else&nbsp;{<br></div>
<div>&nbsp; done = true<br></div>
<div>&nbsp; return nil<br></div>
<div>}<br></div>
<div>return element<br></div>
<div>&nbsp;</div>
<div>If the generator is then used in the common case:<br></div>
<div>&nbsp;</div>
<div>let generator = TakeWhileGenerator(...)<br></div>
<div>while let element = generator.next() {<br></div>
<div>&nbsp; foo(element)<br></div>
<div>}<br></div>
<div>&nbsp;</div>
<div>Should give us effectively:<br></div>
<div>&nbsp;</div>
<div>var base = ...<br></div>
<div>let predicate = ...<br></div>
<div><div>var done = false<br></div>
<div>while true {<br></div>
<div>&nbsp; if done { break }<br></div>
<div>&nbsp; guard let element = base.next() where predicate(element) else {<br></div>
<div>&nbsp; &nbsp; done = true<br></div>
<div>&nbsp; &nbsp; break<br></div>
<div>&nbsp; }<br></div>
<div>&nbsp; foo(element)<br></div>
<div>}<br></div>
<div>&nbsp;</div>
<div>The optimizer should&nbsp;see&nbsp;(or at least could see) `done` is never read after it's written to (thus removing the assignment), and therefore when&nbsp;checking&nbsp;the condition&nbsp;it can only be false (thus it can also be removed).<br></div>
</div>
</blockquote><div>&nbsp;</div>
<div>This may be doable for stdlib generators, but Swift currently has a limitation where generic types/functions defined outside the current file (or module with -whole-module-optimization) are only specialized for their parameters if they come from the stdlib. Any such types/functions defined in third-party libraries (or in other files if you're not using -whole-module-optimization) use virtual dispatch on the generic parameters instead. This means that any generic GeneratorTypes defined in third-party libraries won't be able to optimize away this check as it won't be able to tell that it isn't needed.<br></div>
<div>&nbsp;</div>
<div>-Kevin Ballard</div>
</body>
</html>