<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi Reid,<div class=""><br class=""></div><div class="">Looks like this commit broke at least a bot:</div><div class=""><a href="http://lab.llvm.org:8080/green/job/clang-stage1-configure-RA_check/6959/consoleFull#10105486868254eaf0-7326-4999-85b0-388101f2d404" class="">http://lab.llvm.org:8080/green/job/clang-stage1-configure-RA_check/6959/consoleFull#10105486868254eaf0-7326-4999-85b0-388101f2d404</a></div><div class=""><br class=""></div><div class="">Could you investigate please?</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">-Quentin<br class=""><div><blockquote type="cite" class=""><div class="">On May 12, 2015, at 1:56 PM, Reid Kleckner <<a href="mailto:reid@kleckner.net" class="">reid@kleckner.net</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">Author: rnk<br class="">Date: Tue May 12 15:56:32 2015<br class="">New Revision: 237175<br class=""><br class="">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=237175&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=237175&view=rev</a><br class="">Log:<br class="">[X86] Always return the sret parameter in eax/rax, even on 32-bit<br class=""><br class="">Summary:<br class="">This rule was always in the old SysV i386 ABI docs and the new ones that<br class="">H.J. Lu has put together, but we never noticed:<br class=""><br class="">  EAX   scratch register; also used to return integer and pointer values<br class="">        from functions; also stores the address of a returned struct or union<br class=""><br class="">Fixes PR23491.<br class=""><br class="">Reviewers: majnemer<br class=""><br class="">Subscribers: llvm-commits<br class=""><br class="">Differential Revision: <a href="http://reviews.llvm.org/D9715" class="">http://reviews.llvm.org/D9715</a><br class=""><br class="">Modified:<br class="">    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br class="">    llvm/trunk/test/CodeGen/X86/cmovcmov.ll<br class="">    llvm/trunk/test/CodeGen/X86/sret-implicit.ll<br class=""><br class="">Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=237175&r1=237174&r2=237175&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=237175&r1=237174&r2=237175&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)<br class="">+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue May 12 15:56:32 2015<br class="">@@ -2000,9 +2000,8 @@ X86TargetLowering::LowerReturn(SDValue C<br class="">     RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));<br class="">   }<br class=""><br class="">-  // The x86-64 ABIs require that for returning structs by value we copy<br class="">+  // All x86 ABIs require that for returning structs by value we copy<br class="">   // the sret argument into %rax/%eax (depending on ABI) for the return.<br class="">-  // Win32 requires us to put the sret argument to %eax as well.<br class="">   // We saved the argument into a virtual register in the entry block,<br class="">   // so now we copy the value out and into %rax/%eax.<br class="">   //<br class="">@@ -2011,8 +2010,6 @@ X86TargetLowering::LowerReturn(SDValue C<br class="">   // false, then an sret argument may be implicitly inserted in the SelDAG. In<br class="">   // either case FuncInfo->setSRetReturnReg() will have been called.<br class="">   if (unsigned SRetReg = FuncInfo->getSRetReturnReg()) {<br class="">-    assert((Subtarget->is64Bit() || Subtarget->isTargetKnownWindowsMSVC()) &&<br class="">-           "No need for an sret register");<br class="">     SDValue Val = DAG.getCopyFromReg(Chain, dl, SRetReg, getPointerTy());<br class=""><br class="">     unsigned RetValReg<br class="">@@ -2434,24 +2431,21 @@ X86TargetLowering::LowerFormalArguments(<br class="">     InVals.push_back(ArgValue);<br class="">   }<br class=""><br class="">-  if (Subtarget->is64Bit() || Subtarget->isTargetKnownWindowsMSVC()) {<br class="">-    for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {<br class="">-      // The x86-64 ABIs require that for returning structs by value we copy<br class="">-      // the sret argument into %rax/%eax (depending on ABI) for the return.<br class="">-      // Win32 requires us to put the sret argument to %eax as well.<br class="">-      // Save the argument into a virtual register so that we can access it<br class="">-      // from the return points.<br class="">-      if (Ins[i].Flags.isSRet()) {<br class="">-        unsigned Reg = FuncInfo->getSRetReturnReg();<br class="">-        if (!Reg) {<br class="">-          MVT PtrTy = getPointerTy();<br class="">-          Reg = MF.getRegInfo().createVirtualRegister(getRegClassFor(PtrTy));<br class="">-          FuncInfo->setSRetReturnReg(Reg);<br class="">-        }<br class="">-        SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, InVals[i]);<br class="">-        Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Copy, Chain);<br class="">-        break;<br class="">+  for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {<br class="">+    // All x86 ABIs require that for returning structs by value we copy the<br class="">+    // sret argument into %rax/%eax (depending on ABI) for the return. Save<br class="">+    // the argument into a virtual register so that we can access it from the<br class="">+    // return points.<br class="">+    if (Ins[i].Flags.isSRet()) {<br class="">+      unsigned Reg = FuncInfo->getSRetReturnReg();<br class="">+      if (!Reg) {<br class="">+        MVT PtrTy = getPointerTy();<br class="">+        Reg = MF.getRegInfo().createVirtualRegister(getRegClassFor(PtrTy));<br class="">+        FuncInfo->setSRetReturnReg(Reg);<br class="">       }<br class="">+      SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, InVals[i]);<br class="">+      Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Copy, Chain);<br class="">+      break;<br class="">     }<br class="">   }<br class=""><br class=""><br class="">Modified: llvm/trunk/test/CodeGen/X86/cmovcmov.ll<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/cmovcmov.ll?rev=237175&r1=237174&r2=237175&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/cmovcmov.ll?rev=237175&r1=237174&r2=237175&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/test/CodeGen/X86/cmovcmov.ll (original)<br class="">+++ llvm/trunk/test/CodeGen/X86/cmovcmov.ll Tue May 12 15:56:32 2015<br class="">@@ -143,19 +143,19 @@ entry:<br class=""> ; NOCMOV-NEXT:   jp  [[TBB]]<br class=""> ; NOCMOV-NEXT:   leal  24(%esp), %eax<br class=""> ; NOCMOV-NEXT: [[TBB]]:<br class="">-; NOCMOV-NEXT:   movl  (%eax), %eax<br class="">-; NOCMOV-NEXT:   leal  44(%esp), %ecx<br class="">+; NOCMOV-NEXT:   movl  (%eax), %ecx<br class="">+; NOCMOV-NEXT:   leal  44(%esp), %edx<br class=""> ; NOCMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]<br class=""> ; NOCMOV-NEXT:   jp  [[TBB]]<br class="">-; NOCMOV-NEXT:   leal  28(%esp), %ecx<br class="">+; NOCMOV-NEXT:   leal  28(%esp), %edx<br class=""> ; NOCMOV-NEXT: [[TBB]]:<br class="">-; NOCMOV-NEXT:   movl  (%ecx), %ecx<br class="">+; NOCMOV-NEXT:   movl  12(%esp), %eax<br class="">+; NOCMOV-NEXT:   movl  (%edx), %edx<br class=""> ; NOCMOV-NEXT:   leal  48(%esp), %esi<br class=""> ; NOCMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]<br class=""> ; NOCMOV-NEXT:   jp  [[TBB]]<br class=""> ; NOCMOV-NEXT:   leal  32(%esp), %esi<br class=""> ; NOCMOV-NEXT: [[TBB]]:<br class="">-; NOCMOV-NEXT:   movl  12(%esp), %edx<br class=""> ; NOCMOV-NEXT:   movl  (%esi), %esi<br class=""> ; NOCMOV-NEXT:   leal  52(%esp), %edi<br class=""> ; NOCMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]<br class="">@@ -163,10 +163,10 @@ entry:<br class=""> ; NOCMOV-NEXT:   leal  36(%esp), %edi<br class=""> ; NOCMOV-NEXT: [[TBB]]:<br class=""> ; NOCMOV-NEXT:   movl  (%edi), %edi<br class="">-; NOCMOV-NEXT:   movl  %edi, 12(%edx)<br class="">-; NOCMOV-NEXT:   movl  %esi, 8(%edx)<br class="">-; NOCMOV-NEXT:   movl  %ecx, 4(%edx)<br class="">-; NOCMOV-NEXT:   movl  %eax, (%edx)<br class="">+; NOCMOV-NEXT:   movl  %edi, 12(%eax)<br class="">+; NOCMOV-NEXT:   movl  %esi, 8(%eax)<br class="">+; NOCMOV-NEXT:   movl  %edx, 4(%eax)<br class="">+; NOCMOV-NEXT:   movl  %ecx, (%eax)<br class=""> ; NOCMOV-NEXT:   popl  %esi<br class=""> ; NOCMOV-NEXT:   popl  %edi<br class=""> ; NOCMOV-NEXT:   retl  $4<br class=""><br class="">Modified: llvm/trunk/test/CodeGen/X86/sret-implicit.ll<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sret-implicit.ll?rev=237175&r1=237174&r2=237175&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sret-implicit.ll?rev=237175&r1=237174&r2=237175&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/test/CodeGen/X86/sret-implicit.ll (original)<br class="">+++ llvm/trunk/test/CodeGen/X86/sret-implicit.ll Tue May 12 15:56:32 2015<br class="">@@ -1,12 +1,34 @@<br class="">-; RUN: llc -mtriple=x86_64-apple-darwin8 < %s | FileCheck %s<br class="">-; RUN: llc -mtriple=x86_64-pc-linux < %s | FileCheck %s<br class="">-; RUN: llc -mtriple=x86_64-apple-darwin8 -terminal-rule < %s | FileCheck %s<br class="">-; RUN: llc -mtriple=x86_64-pc-linux -terminal-rule < %s | FileCheck %s<br class="">-<br class="">-; CHECK-LABEL: return32<br class="">-; CHECK-DAG: movq<span class="Apple-tab-span" style="white-space:pre">     </span>$0, (%rdi)<br class="">-; CHECK-DAG: movq<span class="Apple-tab-span" style="white-space:pre">   </span>%rdi, %rax<br class="">-; CHECK: retq<br class="">-define i256 @return32() {<br class="">+; RUN: llc -mtriple=x86_64-apple-darwin8 < %s | FileCheck %s --check-prefix=X64<br class="">+; RUN: llc -mtriple=x86_64-pc-linux < %s | FileCheck %s --check-prefix=X64<br class="">+; RUN: llc -mtriple=i686-pc-linux < %s | FileCheck %s --check-prefix=X86<br class="">+; RUN: llc -mtriple=x86_64-apple-darwin8 -terminal-rule < %s | FileCheck %s --check-prefix=X64<br class="">+; RUN: llc -mtriple=x86_64-pc-linux -terminal-rule < %s | FileCheck %s --check-prefix=X64<br class="">+<br class="">+define void @sret_void(i32* sret %p) {<br class="">+  store i32 0, i32* %p<br class="">+  ret void<br class="">+}<br class="">+<br class="">+; X64-LABEL: sret_void<br class="">+; X64-DAG: movl $0, (%rdi)<br class="">+; X64-DAG: movq %rdi, %rax<br class="">+; X64: retq<br class="">+<br class="">+; X86-LABEL: sret_void<br class="">+; X86: movl 4(%esp), %eax<br class="">+; X86: movl $0, (%eax)<br class="">+; X86: retl<br class="">+<br class="">+define i256 @sret_demoted() {<br class="">   ret i256 0<br class=""> }<br class="">+<br class="">+; X64-LABEL: sret_demoted<br class="">+; X64-DAG: movq $0, (%rdi)<br class="">+; X64-DAG: movq %rdi, %rax<br class="">+; X64: retq<br class="">+<br class="">+; X86-LABEL: sret_demoted<br class="">+; X86: movl 4(%esp), %eax<br class="">+; X86: movl $0, (%eax)<br class="">+; X86: retl<br class=""><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@cs.uiuc.edu" class="">llvm-commits@cs.uiuc.edu</a><br class="">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br class=""></div></blockquote></div><br class=""></div></body></html>