<div style="font-family: arial, helvetica, sans-serif"><font size="2">Hi,<div><br><div><div class="gmail_quote">On Wed, Jun 13, 2012 at 9:55 AM, Martinez, Javier E <span dir="ltr"><<a href="mailto:javier.e.martinez@intel.com" target="_blank">javier.e.martinez@intel.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal">Hello,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I’m trying to change the default behavior for how structures are passed to functions to use pass-by-value. Currently LLVM’s default behavior is to pass structures by reference. I’m not disputing the benefits of this but I really want to
 change the default behavior for experimentation purposes.</p></div></div></blockquote><div><br></div><div><br>Are you sure that the current behavior is passing structures by reference?  In your example, the function "convert" is given a pointer %in, but that pointer is marked "byval".  According to <a href="http://llvm.org/docs/LangRef.html" target="_blank">http://llvm.org/docs/LangRef.html</a> that means that it is pass-by-value:</div>

<div><br></div><div> "<span style="font-family:'Times New Roman';font-size:medium;text-align:left">This indicates that the pointer parameter should really be passed by value to the function. </span><span style="font-family:'Times New Roman';font-size:medium;text-align:left">The attribute implies that a hidden copy of the pointee is made between the caller and the callee, so the callee is unable to modify the value in the caller.</span><span style="font-family:'Times New Roman';font-size:medium;text-align:left">"</span></div>

<div><span style="font-family:'Times New Roman';font-size:medium;text-align:left"><br></span></div><div><span style="text-align:left"><font face="arial, helvetica, sans-serif">etc...</font></span></div><div><br></div>

<div>Is the problem that in the backend, you do not see a copy being made?</div><div> </div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">To this end I’ve changed the code in DefaultABIInfo::classifyArgumentType() to use the different types. What I’ve found is that none of the options yield the expected results for the input code (see below). Except for the indirect case,
 the function signature is changed to take each structure element. How can I modify LLVM to pass structures by value?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thanks,<u></u><u></u></p>
<p class="MsoNormal">Javier<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">[Original Code]<u></u><u></u></p>
<p class="MsoNormal">struct myType {<u></u><u></u></p>
<p class="MsoNormal">  long val;<u></u><u></u></p>
<p class="MsoNormal">};<u></u><u></u></p>
<p class="MsoNormal">int convert(struct myType in)<u></u><u></u></p>
<p class="MsoNormal">{<u></u><u></u></p>
<p class="MsoNormal">  return (int)in.val;<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">[Expected Result]<u></u><u></u></p>
<p class="MsoNormal">define i32 @convert(%myType %in) nounwind readonly alwaysinline{<u></u><u></u></p>
<p class="MsoNormal">entry:<u></u><u></u></p>
<p class="MsoNormal">  %in.addr = alloca %myType, align 8<u></u><u></u></p>
<p class="MsoNormal">  store %myType %in, %myType* %in.addr, align 8<u></u><u></u></p>
<p class="MsoNormal">  %0 = getelementptr inbounds %myType* %in.addr, i32 0, i32 0<u></u><u></u></p>
<p class="MsoNormal">  %1 = load i64* %0, align 8<u></u><u></u></p>
<p class="MsoNormal">  %conv = trunc i64 %1 to i32<u></u><u></u></p>
<p class="MsoNormal">  ret i32 %conv<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">[ABIArgInfo::getIndirect(0) – Default]<u></u><u></u></p>
<p class="MsoNormal">%struct.myType = type { i64 }<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">define i32 @convert(%struct.myType* nocapture byval %in) nounwind readonly {<u></u><u></u></p>
<p class="MsoNormal">entry:<u></u><u></u></p>
<p class="MsoNormal">  %val = getelementptr inbounds %struct.myType* %in, i64 0, i32 0<u></u><u></u></p>
<p class="MsoNormal">  %0 = load i64* %val, align 8, !tbaa !0<u></u><u></u></p>
<p class="MsoNormal">  %conv = trunc i64 %0 to i32<u></u><u></u></p>
<p class="MsoNormal">  ret i32 %conv<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">[ABIArgInfo::getExtend(), ABIArgInfo::getDirect(), ABIArgInfo::getExpand()]<u></u><u></u></p>
<p class="MsoNormal">define i32 @convert(i64 %in.coerce0) nounwind readnone {<u></u><u></u></p>
<p class="MsoNormal">entry:<u></u><u></u></p>
<p class="MsoNormal">  %conv = trunc i64 %in.coerce0 to i32<u></u><u></u></p>
<p class="MsoNormal">  ret i32 %conv<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>

<br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">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></div>
</font></div>