<div style="min-height:22px;margin-bottom:8px;">Thanks and happy Christmas Eve :)</div><div style="min-height:22px;margin-bottom:8px;"><br></div><span class="mail-footer">发自我的iPhone</span><div id="original-content"><br><br><div><div style="font-size:70%;padding:2px 0;">------------------ Original ------------------</div><div style="font-size:70%;background:#f0f0f0;color:#212121;padding:8px;border-radius:4px"><div><b>From:</b> Eric Christopher <echristo@gmail.com></div><div><b>Date:</b> 周日,12月 24,2017 0:45 下午</div><div><b>To:</b> Leslie Zhai <lesliezhai@llvm.org.cn></div><div><b>Cc:</b> LLVM Developers <llvm-dev@lists.llvm.org>, chandlerc <chandlerc@gmail.com>, davide <davide@freebsd.org></div><div><b>Subject:</b> Re: BackendUtil's EmitAssemblyHelper::EmitAssembly generated call inwrong order</div></div></div><br>This is a difference in evaluation order between gcc and clang. Basically this is implementation defined behavior that you're depending upon. <br><br><div id="" style=""><div id="mail_fold"><div class="gmail_quote"><div dir="ltr">On Sat, Dec 23, 2017, 7:47 PM Leslie Zhai <<a href="mailto:lesliezhai@llvm.org.cn">lesliezhai@llvm.org.cn</a>> wrote:<br></div><blockquote class="gmail_quote" style="border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); margin: 0px 0px 0px 6.693749904632568px; padding: 14px 16px 14px 8.3671875px; color: rgb(149, 149, 149); background-color: rgb(245, 246, 250);">Hi LLVM developers,<br><br>A C++ testcase for PR35737<br><br>#include <iostream><br><br>int bar() {<br>   std::cout << "bar" << std::endl;<br>   return 1;<br>}<br><br>int main() {<br>   std::cout << "return: " << bar() << std::endl;<br>   return 0;<br>}<br><br>Actual output:<br><br>return: bar<br>1<br><br>Expected output:<br><br>bar<br>return: 1<br><br>Workaround to edit LLVM IR:<br><br>--- PR35737.ll  2017-12-24 11:20:12.012346163 +0800<br>+++ PR35737-workaround.ll       2017-12-24 11:42:25.303256968 +0800<br>@@ -62,8 +62,8 @@<br>  entry:<br>    %retval = alloca i32, align 4<br>    store i32 0, i32* %retval, align 4<br>-  %call = call dereferenceable(272) %"class.std::basic_ostream"*<br>@_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(%"class.std::basic_ostream"*<br>dereferenceable(272) @_ZSt4cout, i8* getelementptr inbounds ([9 x i8],<br>[9 x i8]* @.str.1, i32 0, i32 0))<br>    %call1 = call i32 @_Z3barv()<br>+  %call = call dereferenceable(272) %"class.std::basic_ostream"*<br>@_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(%"class.std::basic_ostream"*<br>dereferenceable(272) @_ZSt4cout, i8* getelementptr inbounds ([9 x i8],<br>[9 x i8]* @.str.1, i32 0, i32 0))<br>    %call2 = call dereferenceable(272) %"class.std::basic_ostream"*<br>@_ZNSolsEi(%"class.std::basic_ostream"* %call, i32 %call1)<br>    %call3 = call dereferenceable(272) %"class.std::basic_ostream"*<br>@_ZNSolsEPFRSoS_E(%"class.std::basic_ostream"* %call2,<br>%"class.std::basic_ostream"* (%"class.std::basic_ostream"*)*<br>@_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_)<br>    ret i32 0<br><br><br>Then,<br><br>$ llc PR35737-workaround.ll<br><br>$ clang++ PR35737-workaround.s<br><br>$ ./a.out<br><br>bar<br>return: 1<br><br>Please give me some advice, thanks a lot!<br><br>--<br>Regards,<br>Leslie Zhai - <a href="https://reviews.llvm.org/p/xiangzhai/" rel="noreferrer" target="_blank">https://reviews.llvm.org/p/xiangzhai/</a><br><br><br></blockquote></div></div></div></div>