<div dir="ltr">Is it possible for Clang generated IR to hit this? I would prefer if Clang avoided relying on CanLowerReturn. So far as I can tell, it is designed to make large struct return work without attempting to respect the local ABI.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 5, 2015 at 10:09 AM, Andrew Trick <span dir="ltr"><<a href="mailto:atrick@apple.com" target="_blank">atrick@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: atrick<br>
Date: Thu Feb  5 12:09:05 2015<br>
New Revision: 228321<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=228321&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=228321&view=rev</a><br>
Log:<br>
X86 ABI fix for return values > 24 bytes.<br>
<br>
The return value's address must be returned in %rax.<br>
i.e. the callee needs to copy the sret argument (%rdi)<br>
into the return value (%rax).<br>
<br>
This probably won't manifest as a bug when the caller is LLVM-compiled<br>
code. But it is an ABI guarantee and tools expect it.<br>
<br>
Added:<br>
    llvm/trunk/test/CodeGen/X86/sret-implicit.ll<br>
Modified:<br>
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
    llvm/trunk/test/CodeGen/X86/vselect.ll<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=228321&r1=228320&r2=228321&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=228321&r1=228320&r2=228321&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Thu Feb  5 12:09:05 2015<br>
@@ -2107,14 +2107,15 @@ X86TargetLowering::LowerReturn(SDValue C<br>
   // Win32 requires us to put the sret argument to %eax as well.<br>
   // We saved the argument into a virtual register in the entry block,<br>
   // so now we copy the value out and into %rax/%eax.<br>
-  if (DAG.getMachineFunction().getFunction()->hasStructRetAttr() &&<br>
-      (Subtarget->is64Bit() || Subtarget->isTargetKnownWindowsMSVC())) {<br>
-    MachineFunction &MF = DAG.getMachineFunction();<br>
-    X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();<br>
-    unsigned Reg = FuncInfo->getSRetReturnReg();<br>
-    assert(Reg &&<br>
-           "SRetReturnReg should have been set in LowerFormalArguments().");<br>
-    SDValue Val = DAG.getCopyFromReg(Chain, dl, Reg, getPointerTy());<br>
+  //<br>
+  // Checking Function.hasStructRetAttr() here is insufficient because the IR<br>
+  // may not have an explicit sret argument. If FuncInfo.CanLowerReturn is<br>
+  // false, then an sret argument may be implicitly inserted in the SelDAG. In<br>
+  // either case FuncInfo->setSRetReturnReg() will have been called.<br>
+  if (unsigned SRetReg = FuncInfo->getSRetReturnReg()) {<br>
+    assert((Subtarget->is64Bit() || Subtarget->isTargetKnownWindowsMSVC()) &&<br>
+           "No need for an sret register");<br>
+    SDValue Val = DAG.getCopyFromReg(Chain, dl, SRetReg, getPointerTy());<br>
<br>
     unsigned RetValReg<br>
         = (Subtarget->is64Bit() && !Subtarget->isTarget64BitILP32()) ?<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/sret-implicit.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sret-implicit.ll?rev=228321&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sret-implicit.ll?rev=228321&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/sret-implicit.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/sret-implicit.ll Thu Feb  5 12:09:05 2015<br>
@@ -0,0 +1,10 @@<br>
+; RUN: llc -mtriple=x86_64-apple-darwin8 < %s | FileCheck %s<br>
+; RUN: llc -mtriple=x86_64-pc-linux < %s | FileCheck %s<br>
+<br>
+; CHECK-LABEL: return32<br>
+; CHECK-DAG: movq      $0, (%rdi)<br>
+; CHECK-DAG: movq      %rdi, %rax<br>
+; CHECK: retq<br>
+define i256 @return32() {<br>
+  ret i256 0<br>
+}<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/vselect.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/vselect.ll?rev=228321&r1=228320&r2=228321&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/vselect.ll?rev=228321&r1=228320&r2=228321&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/vselect.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/vselect.ll Thu Feb  5 12:09:05 2015<br>
@@ -275,6 +275,7 @@ define <16 x double> @select_illegal(<16<br>
 ; CHECK-NEXT:    movaps %xmm2, 32(%rdi)<br>
 ; CHECK-NEXT:    movaps %xmm1, 16(%rdi)<br>
 ; CHECK-NEXT:    movaps %xmm0, (%rdi)<br>
+; CHECK-NEXT:    movq %rdi, %rax<br>
 ; CHECK-NEXT:    retq<br>
   %sel = select <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false>, <16 x double> %a, <16 x double> %b<br>
   ret <16 x double> %sel<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>