<div dir="ltr">If the compiler can't say for sure that your operator new is identical (has no side-effects beyond allocating memory), it would be correct for the compiler to NOT optimise it out - as it can't determine that it has no other effect that your program rely on in some way.<div><br></div><div>--</div><div>Mats</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 4 May 2015 at 11:37, François Fayard <span dir="ltr"><<a href="mailto:fayard.francois@icloud.com" target="_blank">fayard.francois@icloud.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">Hi,<div><br></div><div>I’ve made my own version of std::vector which is called il::Vector. Due to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3664.html" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3664.html</a>, LLVM can optimise away memory allocation. Therefore, the following code optimise away all memory allocation for w resulting in a single allocation during the whole program (for v).</div><div><br></div><div>When using my own vector implementation, I realised that the allocation were not optimized away because I was using ::operator new. When I’ve switched back to new, the optimisation came back.</div><div><br></div><div>Is it expected or a bug from LLVM?</div><div><div><div style="word-wrap:break-word"><div style="word-wrap:break-word"><div style="word-wrap:break-word"><div style="word-wrap:break-word"><div style="word-wrap:break-word"><div><div><br></div><div>François</div><div><br></div></div></div></div></div></div></div></div></div><div>=====</div><div><br></div><div><div>#include <iostream></div><div>#include <vector></div><div><br></div><div><br></div><div>std::vector<double> f_val(std::size_t i, std::size_t n) {</div><div>    auto v = std::vector<double>(n);</div><div>    for (std::size_t k = 0; k < v.size(); ++k) {</div><div>        v[k] = static_cast<double>(i);</div><div>    }</div><div>    return v;</div><div>}</div><div><br></div><div>int main (int argc, char const *argv[])</div><div>{</div><div>    const auto n = std::size_t{10};</div><div>    const auto nb_loops = std::size_t{300000000};</div><div><br></div><div>    auto v = std::vector<double>( n, 0.0 );</div><div>    for (std::size_t i = 0; i < nb_loops; ++i) {</div><div>        auto w = f_val(i, n);</div><div>        for (std::size_t k = 0; k < v.size(); ++k) {</div><div>            v[k] += w[k];</div><div>        }</div><div>    }</div><div>    std::cout << v[0] << " " << v[n - 1] << std::endl;</div><div><br></div><div>    return 0;</div><div>}</div></div>
<br></div><br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
<br></blockquote></div><br></div>