<div dir="ltr"><div><div><div><div><div><div>Hi,<br><br></div>I'm here again with an other issue with pass ordering:<br><br></div>Take a look at the following code.<br>#include <stdio.h><br>#include <functional><br>
<br>int main() {<br>        std::function<void(const char*)> hello = [](const char *name){printf("Hello %s\n", name);};<br>        hello("World");<br>        return 0;<br>}<br><br></div>When I compile it with -O3 the optimizer does not recognize all optimizations. Instead I get 143 lines of complicated landing pad code, allocas etc..<br>
<br></div>When I put this code into an other opt -O3 process, I get much better code: 23 lines of code where the main function simply consists of a single printf call. (1 line) -> optimal code that I would write in C.<br>
<br></div>So, when using sophisticated stl data structures like std::function, std::vector, std::string, they are not molten down to their C equivalents until the optimizer runs twice, there is something wrong with pass ordering. Existing passes are okay, but they are not called often enough to remove all overhead. I hope there will be further work on rerunning passes.<br>
<br></div>Cheers<br></div>