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 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="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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>