<div dir="ltr">Hey Tom, I'd like to propose merging this into 4.0.1. I know it is both somewhat late and somewhat large, but Linux kernel developers are asking me for it to be included in a released version of LLVM and Clang to simplify things, and so if it isn't too high of risk, I'd like to float the idea of pulling it.<div><br></div><div>CC-ing both the reviewers but also some other interested parties since it's a bit higher risk than usual.</div><div><br></div><div>-Chandler<br><br><div class="gmail_quote"><div dir="ltr">On Fri, Mar 17, 2017 at 5:56 PM Nirav Dave via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: niravd<br>
Date: Fri Mar 17 19:44:07 2017<br>
New Revision: 298179<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=298179&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=298179&view=rev</a><br>
Log:<br>
Make library calls sensitive to regparm module flag (Fixes PR3997).<br>
<br>
Reviewers: mkuper, rnk<br>
<br>
Subscribers: mehdi_amini, jyknight, aemerson, llvm-commits, rengolin<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D27050" rel="noreferrer" target="_blank">https://reviews.llvm.org/D27050</a><br>
<br>
Added:<br>
    llvm/trunk/test/CodeGen/X86/regparm.ll<br>
Modified:<br>
    llvm/trunk/include/llvm/CodeGen/FastISel.h<br>
    llvm/trunk/include/llvm/IR/Module.h<br>
    llvm/trunk/include/llvm/Target/TargetLowering.h<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp<br>
    llvm/trunk/lib/IR/Module.cpp<br>
    llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp<br>
    llvm/trunk/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp<br>
    llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp<br>
    llvm/trunk/lib/Target/ARM/ARMSelectionDAGInfo.cpp<br>
    llvm/trunk/lib/Target/AVR/AVRISelLowering.cpp<br>
    llvm/trunk/lib/Target/Hexagon/HexagonSelectionDAGInfo.cpp<br>
    llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp<br>
    llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp<br>
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
    llvm/trunk/lib/Target/X86/X86ISelLowering.h<br>
    llvm/trunk/lib/Target/X86/X86SelectionDAGInfo.cpp<br>
    llvm/trunk/lib/Target/XCore/XCoreISelLowering.cpp<br>
    llvm/trunk/lib/Target/XCore/XCoreSelectionDAGInfo.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/CodeGen/FastISel.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/FastISel.h?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/FastISel.h?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/CodeGen/FastISel.h (original)<br>
+++ llvm/trunk/include/llvm/CodeGen/FastISel.h Fri Mar 17 19:44:07 2017<br>
@@ -41,32 +41,8 @@ class MachineConstantPool;<br>
 /// quickly.<br>
 class FastISel {<br>
 public:<br>
-  struct ArgListEntry {<br>
-    Value *Val = nullptr;<br>
-    Type *Ty = nullptr;<br>
-    bool IsSExt : 1;<br>
-    bool IsZExt : 1;<br>
-    bool IsInReg : 1;<br>
-    bool IsSRet : 1;<br>
-    bool IsNest : 1;<br>
-    bool IsByVal : 1;<br>
-    bool IsInAlloca : 1;<br>
-    bool IsReturned : 1;<br>
-    bool IsSwiftSelf : 1;<br>
-    bool IsSwiftError : 1;<br>
-    uint16_t Alignment = 0;<br>
-<br>
-    ArgListEntry()<br>
-        : IsSExt(false), IsZExt(false), IsInReg(false), IsSRet(false),<br>
-          IsNest(false), IsByVal(false), IsInAlloca(false), IsReturned(false),<br>
-          IsSwiftSelf(false), IsSwiftError(false) {}<br>
-<br>
-    /// \brief Set CallLoweringInfo attribute flags based on a call instruction<br>
-    /// and called function attributes.<br>
-    void setAttributes(ImmutableCallSite *CS, unsigned AttrIdx);<br>
-  };<br>
-  typedef std::vector<ArgListEntry> ArgListTy;<br>
-<br>
+  typedef TargetLoweringBase::ArgListEntry ArgListEntry;<br>
+  typedef TargetLoweringBase::ArgListTy ArgListTy;<br>
   struct CallLoweringInfo {<br>
     Type *RetTy = nullptr;<br>
     bool RetSExt : 1;<br>
<br>
Modified: llvm/trunk/include/llvm/IR/Module.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Module.h?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Module.h?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/Module.h (original)<br>
+++ llvm/trunk/include/llvm/IR/Module.h Fri Mar 17 19:44:07 2017<br>
@@ -726,6 +726,10 @@ public:<br>
 /// @name Utility functions for querying Debug information.<br>
 /// @{<br>
<br>
+  /// \brief Returns the Number of Register ParametersDwarf Version by checking<br>
+  /// module flags.<br>
+  unsigned getNumberRegisterParameters() const;<br>
+<br>
   /// \brief Returns the Dwarf Version by checking module flags.<br>
   unsigned getDwarfVersion() const;<br>
<br>
<br>
Modified: llvm/trunk/include/llvm/Target/TargetLowering.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Target/TargetLowering.h (original)<br>
+++ llvm/trunk/include/llvm/Target/TargetLowering.h Fri Mar 17 19:44:07 2017<br>
@@ -25,13 +25,14 @@<br>
<br>
 #include "llvm/ADT/ArrayRef.h"<br>
 #include "llvm/ADT/DenseMap.h"<br>
-#include "llvm/ADT/SmallVector.h"<br>
 #include "llvm/ADT/STLExtras.h"<br>
+#include "llvm/ADT/SmallVector.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/CodeGen/DAGCombine.h"<br>
 #include "llvm/CodeGen/ISDOpcodes.h"<br>
 #include "llvm/CodeGen/MachineValueType.h"<br>
 #include "llvm/CodeGen/RuntimeLibcalls.h"<br>
+#include "llvm/CodeGen/SelectionDAG.h"<br>
 #include "llvm/CodeGen/SelectionDAGNodes.h"<br>
 #include "llvm/CodeGen/ValueTypes.h"<br>
 #include "llvm/IR/Attributes.h"<br>
@@ -2628,6 +2629,20 @@ public:<br>
       return *this;<br>
     }<br>
<br>
+    // setCallee with target/module-specific attributes<br>
+    CallLoweringInfo &setLibCallee(CallingConv::ID CC, Type *ResultType,<br>
+                                   SDValue Target, ArgListTy &&ArgsList) {<br>
+      RetTy = ResultType;<br>
+      Callee = Target;<br>
+      CallConv = CC;<br>
+      NumFixedArgs = Args.size();<br>
+      Args = std::move(ArgsList);<br>
+<br>
+      DAG.getTargetLoweringInfo().markLibCallAttributes(<br>
+          &(DAG.getMachineFunction()), CC, Args);<br>
+      return *this;<br>
+    }<br>
+<br>
     CallLoweringInfo &setCallee(CallingConv::ID CC, Type *ResultType,<br>
                                 SDValue Target, ArgListTy &&ArgsList) {<br>
       RetTy = ResultType;<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Fri Mar 17 19:44:07 2017<br>
@@ -119,21 +119,6 @@ STATISTIC(NumFastIselSuccessTarget, "Num<br>
                                     "target-specific selector");<br>
 STATISTIC(NumFastIselDead, "Number of dead insts removed on failure");<br>
<br>
-void FastISel::ArgListEntry::setAttributes(ImmutableCallSite *CS,<br>
-                                           unsigned AttrIdx) {<br>
-  IsSExt = CS->paramHasAttr(AttrIdx, Attribute::SExt);<br>
-  IsZExt = CS->paramHasAttr(AttrIdx, Attribute::ZExt);<br>
-  IsInReg = CS->paramHasAttr(AttrIdx, Attribute::InReg);<br>
-  IsSRet = CS->paramHasAttr(AttrIdx, Attribute::StructRet);<br>
-  IsNest = CS->paramHasAttr(AttrIdx, Attribute::Nest);<br>
-  IsByVal = CS->paramHasAttr(AttrIdx, Attribute::ByVal);<br>
-  IsInAlloca = CS->paramHasAttr(AttrIdx, Attribute::InAlloca);<br>
-  IsReturned = CS->paramHasAttr(AttrIdx, Attribute::Returned);<br>
-  IsSwiftSelf = CS->paramHasAttr(AttrIdx, Attribute::SwiftSelf);<br>
-  IsSwiftError = CS->paramHasAttr(AttrIdx, Attribute::SwiftError);<br>
-  Alignment = CS->getParamAlignment(AttrIdx);<br>
-}<br>
-<br>
 /// Set the current block to which generated machine instructions will be<br>
 /// appended, and clear the local CSE map.<br>
 void FastISel::startNewBlock() {<br>
@@ -929,6 +914,7 @@ bool FastISel::lowerCallTo(const CallIns<br>
     Entry.setAttributes(&CS, ArgI + 1);<br>
     Args.push_back(Entry);<br>
   }<br>
+  TLI.markLibCallAttributes(MF, CS.getCallingConv(), Args);<br>
<br>
   CallLoweringInfo CLI;<br>
   CLI.setCallee(RetTy, FTy, Symbol, std::move(Args), CS, NumArgs);<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Fri Mar 17 19:44:07 2017<br>
@@ -1935,9 +1935,13 @@ SDValue SelectionDAGLegalize::ExpandLibC<br>
     InChain = TCChain;<br>
<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(SDLoc(Node)).setChain(InChain)<br>
-    .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))<br>
-    .setTailCall(isTailCall).setSExtResult(isSigned).setZExtResult(!isSigned);<br>
+  CLI.setDebugLoc(SDLoc(Node))<br>
+      .setChain(InChain)<br>
+      .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,<br>
+                    std::move(Args))<br>
+      .setTailCall(isTailCall)<br>
+      .setSExtResult(isSigned)<br>
+      .setZExtResult(!isSigned);<br>
<br>
   std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);<br>
<br>
@@ -1970,9 +1974,12 @@ SDValue SelectionDAGLegalize::ExpandLibC<br>
   Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());<br>
<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(dl).setChain(DAG.getEntryNode())<br>
-    .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))<br>
-    .setSExtResult(isSigned).setZExtResult(!isSigned);<br>
+  CLI.setDebugLoc(dl)<br>
+      .setChain(DAG.getEntryNode())<br>
+      .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,<br>
+                    std::move(Args))<br>
+      .setSExtResult(isSigned)<br>
+      .setZExtResult(!isSigned);<br>
<br>
   std::pair<SDValue,SDValue> CallInfo = TLI.LowerCallTo(CLI);<br>
<br>
@@ -2004,9 +2011,12 @@ SelectionDAGLegalize::ExpandChainLibCall<br>
   Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext());<br>
<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(SDLoc(Node)).setChain(InChain)<br>
-    .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))<br>
-    .setSExtResult(isSigned).setZExtResult(!isSigned);<br>
+  CLI.setDebugLoc(SDLoc(Node))<br>
+      .setChain(InChain)<br>
+      .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,<br>
+                    std::move(Args))<br>
+      .setSExtResult(isSigned)<br>
+      .setZExtResult(!isSigned);<br>
<br>
   std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);<br>
<br>
@@ -2099,9 +2109,12 @@ SelectionDAGLegalize::ExpandDivRemLibCal<br>
<br>
   SDLoc dl(Node);<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(dl).setChain(InChain)<br>
-    .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))<br>
-    .setSExtResult(isSigned).setZExtResult(!isSigned);<br>
+  CLI.setDebugLoc(dl)<br>
+      .setChain(InChain)<br>
+      .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,<br>
+                    std::move(Args))<br>
+      .setSExtResult(isSigned)<br>
+      .setZExtResult(!isSigned);<br>
<br>
   std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);<br>
<br>
@@ -2210,9 +2223,9 @@ SelectionDAGLegalize::ExpandSinCosLibCal<br>
<br>
   SDLoc dl(Node);<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(dl).setChain(InChain)<br>
-    .setCallee(TLI.getLibcallCallingConv(LC),<br>
-               Type::getVoidTy(*DAG.getContext()), Callee, std::move(Args));<br>
+  CLI.setDebugLoc(dl).setChain(InChain).setLibCallee(<br>
+      TLI.getLibcallCallingConv(LC), Type::getVoidTy(*DAG.getContext()), Callee,<br>
+      std::move(Args));<br>
<br>
   std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);<br>
<br>
@@ -3830,10 +3843,11 @@ void SelectionDAGLegalize::ConvertNodeTo<br>
     TargetLowering::CallLoweringInfo CLI(DAG);<br>
     CLI.setDebugLoc(dl)<br>
         .setChain(Node->getOperand(0))<br>
-        .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),<br>
-                   DAG.getExternalSymbol("__sync_synchronize",<br>
-                                         TLI.getPointerTy(DAG.getDataLayout())),<br>
-                   std::move(Args));<br>
+        .setLibCallee(<br>
+            CallingConv::C, Type::getVoidTy(*DAG.getContext()),<br>
+            DAG.getExternalSymbol("__sync_synchronize",<br>
+                                  TLI.getPointerTy(DAG.getDataLayout())),<br>
+            std::move(Args));<br>
<br>
     std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);<br>
<br>
@@ -3870,10 +3884,10 @@ void SelectionDAGLegalize::ConvertNodeTo<br>
     TargetLowering::CallLoweringInfo CLI(DAG);<br>
     CLI.setDebugLoc(dl)<br>
         .setChain(Node->getOperand(0))<br>
-        .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),<br>
-                   DAG.getExternalSymbol("abort",<br>
-                                         TLI.getPointerTy(DAG.getDataLayout())),<br>
-                   std::move(Args));<br>
+        .setLibCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),<br>
+                      DAG.getExternalSymbol(<br>
+                          "abort", TLI.getPointerTy(DAG.getDataLayout())),<br>
+                      std::move(Args));<br>
     std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);<br>
<br>
     Results.push_back(CallResult.second);<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp Fri Mar 17 19:44:07 2017<br>
@@ -2607,7 +2607,7 @@ void DAGTypeLegalizer::ExpandIntRes_XMUL<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
   CLI.setDebugLoc(dl)<br>
       .setChain(Chain)<br>
-      .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Func, std::move(Args))<br>
+      .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Func, std::move(Args))<br>
       .setSExtResult();<br>
<br>
   std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp Fri Mar 17 19:44:07 2017<br>
@@ -1094,9 +1094,12 @@ DAGTypeLegalizer::ExpandChainLibCall(RTL<br>
   Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext());<br>
<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(SDLoc(Node)).setChain(InChain)<br>
-    .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))<br>
-    .setSExtResult(isSigned).setZExtResult(!isSigned);<br>
+  CLI.setDebugLoc(SDLoc(Node))<br>
+      .setChain(InChain)<br>
+      .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,<br>
+                    std::move(Args))<br>
+      .setSExtResult(isSigned)<br>
+      .setZExtResult(!isSigned);<br>
<br>
   std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);<br>
<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri Mar 17 19:44:07 2017<br>
@@ -5175,11 +5175,11 @@ SDValue SelectionDAG::getMemcpy(SDValue<br>
   TargetLowering::CallLoweringInfo CLI(*this);<br>
   CLI.setDebugLoc(dl)<br>
       .setChain(Chain)<br>
-      .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY),<br>
-                 Dst.getValueType().getTypeForEVT(*getContext()),<br>
-                 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY),<br>
-                                   TLI->getPointerTy(getDataLayout())),<br>
-                 std::move(Args))<br>
+      .setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY),<br>
+                    Dst.getValueType().getTypeForEVT(*getContext()),<br>
+                    getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY),<br>
+                                      TLI->getPointerTy(getDataLayout())),<br>
+                    std::move(Args))<br>
       .setDiscardResult()<br>
       .setTailCall(isTailCall);<br>
<br>
@@ -5236,11 +5236,11 @@ SDValue SelectionDAG::getMemmove(SDValue<br>
   TargetLowering::CallLoweringInfo CLI(*this);<br>
   CLI.setDebugLoc(dl)<br>
       .setChain(Chain)<br>
-      .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE),<br>
-                 Dst.getValueType().getTypeForEVT(*getContext()),<br>
-                 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE),<br>
-                                   TLI->getPointerTy(getDataLayout())),<br>
-                 std::move(Args))<br>
+      .setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE),<br>
+                    Dst.getValueType().getTypeForEVT(*getContext()),<br>
+                    getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE),<br>
+                                      TLI->getPointerTy(getDataLayout())),<br>
+                    std::move(Args))<br>
       .setDiscardResult()<br>
       .setTailCall(isTailCall);<br>
<br>
@@ -5298,11 +5298,11 @@ SDValue SelectionDAG::getMemset(SDValue<br>
   TargetLowering::CallLoweringInfo CLI(*this);<br>
   CLI.setDebugLoc(dl)<br>
       .setChain(Chain)<br>
-      .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET),<br>
-                 Dst.getValueType().getTypeForEVT(*getContext()),<br>
-                 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET),<br>
-                                   TLI->getPointerTy(getDataLayout())),<br>
-                 std::move(Args))<br>
+      .setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET),<br>
+                    Dst.getValueType().getTypeForEVT(*getContext()),<br>
+                    getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET),<br>
+                                      TLI->getPointerTy(getDataLayout())),<br>
+                    std::move(Args))<br>
       .setDiscardResult()<br>
       .setTailCall(isTailCall);<br>
<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Fri Mar 17 19:44:07 2017<br>
@@ -4912,7 +4912,7 @@ SelectionDAGBuilder::visitIntrinsicCall(<br>
       report_fatal_error("Unsupported element size");<br>
<br>
     TargetLowering::CallLoweringInfo CLI(DAG);<br>
-    CLI.setDebugLoc(sdl).setChain(getRoot()).setCallee(<br>
+    CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(<br>
         TLI.getLibcallCallingConv(LibraryCall),<br>
         Type::getVoidTy(*DAG.getContext()),<br>
         DAG.getExternalSymbol(TLI.getLibcallName(LibraryCall),<br>
@@ -5536,7 +5536,7 @@ SelectionDAGBuilder::visitIntrinsicCall(<br>
     TargetLowering::ArgListTy Args;<br>
<br>
     TargetLowering::CallLoweringInfo CLI(DAG);<br>
-    CLI.setDebugLoc(sdl).setChain(getRoot()).setCallee(<br>
+    CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(<br>
         CallingConv::C, I.getType(),<br>
         DAG.getExternalSymbol(TrapFuncName.data(),<br>
                               TLI.getPointerTy(DAG.getDataLayout())),<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Fri Mar 17 19:44:07 2017<br>
@@ -96,8 +96,8 @@ bool TargetLowering::parametersInCSRMatc<br>
<br>
 /// \brief Set CallLoweringInfo attribute flags based on a call instruction<br>
 /// and called function attributes.<br>
-void TargetLowering::ArgListEntry::setAttributes(ImmutableCallSite *CS,<br>
-                                                 unsigned AttrIdx) {<br>
+void TargetLoweringBase::ArgListEntry::setAttributes(ImmutableCallSite *CS,<br>
+                                                     unsigned AttrIdx) {<br>
   IsSExt = CS->paramHasAttr(AttrIdx, Attribute::SExt);<br>
   IsZExt = CS->paramHasAttr(AttrIdx, Attribute::ZExt);<br>
   IsInReg = CS->paramHasAttr(AttrIdx, Attribute::InReg);<br>
@@ -138,10 +138,13 @@ TargetLowering::makeLibCall(SelectionDAG<br>
   Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
   bool signExtend = shouldSignExtendTypeInLibCall(RetVT, isSigned);<br>
-  CLI.setDebugLoc(dl).setChain(DAG.getEntryNode())<br>
-    .setCallee(getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))<br>
-    .setNoReturn(doesNotReturn).setDiscardResult(!isReturnValueUsed)<br>
-    .setSExtResult(signExtend).setZExtResult(!signExtend);<br>
+  CLI.setDebugLoc(dl)<br>
+      .setChain(DAG.getEntryNode())<br>
+      .setLibCallee(getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))<br>
+      .setNoReturn(doesNotReturn)<br>
+      .setDiscardResult(!isReturnValueUsed)<br>
+      .setSExtResult(signExtend)<br>
+      .setZExtResult(!signExtend);<br>
   return LowerCallTo(CLI);<br>
 }<br>
<br>
@@ -3853,7 +3856,7 @@ SDValue TargetLowering::LowerToTLSEmulat<br>
<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
   CLI.setDebugLoc(dl).setChain(DAG.getEntryNode());<br>
-  CLI.setCallee(CallingConv::C, VoidPtrType, EmuTlsGetAddr, std::move(Args));<br>
+  CLI.setLibCallee(CallingConv::C, VoidPtrType, EmuTlsGetAddr, std::move(Args));<br>
   std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);<br>
<br>
   // TLSADDR will be codegen'ed as call. Inform MFI that function has calls.<br>
<br>
Modified: llvm/trunk/lib/IR/Module.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Module.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Module.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/Module.cpp (original)<br>
+++ llvm/trunk/lib/IR/Module.cpp Fri Mar 17 19:44:07 2017<br>
@@ -465,6 +465,14 @@ void Module::dropAllReferences() {<br>
     GIF.dropAllReferences();<br>
 }<br>
<br>
+unsigned Module::getNumberRegisterParameters() const {<br>
+  auto *Val =<br>
+      cast_or_null<ConstantAsMetadata>(getModuleFlag("NumRegisterParameters"));<br>
+  if (!Val)<br>
+    return 0;<br>
+  return cast<ConstantInt>(Val->getValue())->getZExtValue();<br>
+}<br>
+<br>
 unsigned Module::getDwarfVersion() const {<br>
   auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("Dwarf Version"));<br>
   if (!Val)<br>
<br>
Modified: llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp Fri Mar 17 19:44:07 2017<br>
@@ -2123,8 +2123,9 @@ SDValue AArch64TargetLowering::LowerFSIN<br>
<br>
   StructType *RetTy = StructType::get(ArgTy, ArgTy, nullptr);<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(dl).setChain(DAG.getEntryNode())<br>
-    .setCallee(CallingConv::Fast, RetTy, Callee, std::move(Args));<br>
+  CLI.setDebugLoc(dl)<br>
+      .setChain(DAG.getEntryNode())<br>
+      .setLibCallee(CallingConv::Fast, RetTy, Callee, std::move(Args));<br>
<br>
   std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);<br>
   return CallResult.first;<br>
<br>
Modified: llvm/trunk/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp (original)<br>
+++ llvm/trunk/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp Fri Mar 17 19:44:07 2017<br>
@@ -44,8 +44,9 @@ SDValue AArch64SelectionDAGInfo::EmitTar<br>
     TargetLowering::CallLoweringInfo CLI(DAG);<br>
     CLI.setDebugLoc(dl)<br>
         .setChain(Chain)<br>
-        .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),<br>
-                   DAG.getExternalSymbol(bzeroEntry, IntPtr), std::move(Args))<br>
+        .setLibCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),<br>
+                      DAG.getExternalSymbol(bzeroEntry, IntPtr),<br>
+                      std::move(Args))<br>
         .setDiscardResult();<br>
     std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);<br>
     return CallResult.second;<br>
<br>
Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Fri Mar 17 19:44:07 2017<br>
@@ -2873,7 +2873,7 @@ ARMTargetLowering::LowerToTLSGeneralDyna<br>
<br>
   // FIXME: is there useful debug info available here?<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(dl).setChain(Chain).setCallee(<br>
+  CLI.setDebugLoc(dl).setChain(Chain).setLibCallee(<br>
       CallingConv::C, Type::getInt32Ty(*DAG.getContext()),<br>
       DAG.getExternalSymbol("__tls_get_addr", PtrVT), std::move(Args));<br>
<br>
<br>
Modified: llvm/trunk/lib/Target/ARM/ARMSelectionDAGInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMSelectionDAGInfo.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMSelectionDAGInfo.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/ARM/ARMSelectionDAGInfo.cpp (original)<br>
+++ llvm/trunk/lib/Target/ARM/ARMSelectionDAGInfo.cpp Fri Mar 17 19:44:07 2017<br>
@@ -114,7 +114,7 @@ SDValue ARMSelectionDAGInfo::EmitSpecial<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
   CLI.setDebugLoc(dl)<br>
       .setChain(Chain)<br>
-      .setCallee(<br>
+      .setLibCallee(<br>
           TLI->getLibcallCallingConv(LC), Type::getVoidTy(*DAG.getContext()),<br>
           DAG.getExternalSymbol(FunctionNames[AEABILibcall][AlignVariant],<br>
                                 TLI->getPointerTy(DAG.getDataLayout())),<br>
<br>
Modified: llvm/trunk/lib/Target/AVR/AVRISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AVR/AVRISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AVR/AVRISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AVR/AVRISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/AVR/AVRISelLowering.cpp Fri Mar 17 19:44:07 2017<br>
@@ -356,7 +356,7 @@ SDValue AVRTargetLowering::LowerDivRem(S<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
   CLI.setDebugLoc(dl)<br>
       .setChain(InChain)<br>
-      .setCallee(getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))<br>
+      .setLibCallee(getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))<br>
       .setInRegister()<br>
       .setSExtResult(isSigned)<br>
       .setZExtResult(!isSigned);<br>
@@ -1983,4 +1983,3 @@ unsigned AVRTargetLowering::getRegisterB<br>
 }<br>
<br>
 } // end of namespace llvm<br>
-<br>
<br>
Modified: llvm/trunk/lib/Target/Hexagon/HexagonSelectionDAGInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonSelectionDAGInfo.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonSelectionDAGInfo.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/Hexagon/HexagonSelectionDAGInfo.cpp (original)<br>
+++ llvm/trunk/lib/Target/Hexagon/HexagonSelectionDAGInfo.cpp Fri Mar 17 19:44:07 2017<br>
@@ -51,7 +51,7 @@ SDValue HexagonSelectionDAGInfo::EmitTar<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
   CLI.setDebugLoc(dl)<br>
       .setChain(Chain)<br>
-      .setCallee(<br>
+      .setLibCallee(<br>
           TLI.getLibcallCallingConv(RTLIB::MEMCPY),<br>
           Type::getVoidTy(*DAG.getContext()),<br>
           DAG.getTargetExternalSymbol(<br>
<br>
Modified: llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp Fri Mar 17 19:44:07 2017<br>
@@ -1922,8 +1922,9 @@ lowerGlobalTLSAddress(SDValue Op, Select<br>
     Args.push_back(Entry);<br>
<br>
     TargetLowering::CallLoweringInfo CLI(DAG);<br>
-    CLI.setDebugLoc(DL).setChain(DAG.getEntryNode())<br>
-      .setCallee(CallingConv::C, PtrTy, TlsGetAddr, std::move(Args));<br>
+    CLI.setDebugLoc(DL)<br>
+        .setChain(DAG.getEntryNode())<br>
+        .setLibCallee(CallingConv::C, PtrTy, TlsGetAddr, std::move(Args));<br>
     std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);<br>
<br>
     SDValue Ret = CallResult.first;<br>
<br>
Modified: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp Fri Mar 17 19:44:07 2017<br>
@@ -2647,10 +2647,9 @@ SDValue PPCTargetLowering::LowerINIT_TRA<br>
<br>
   // Lower to a call to __trampoline_setup(Trmp, TrampSize, FPtr, ctx_reg)<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(dl).setChain(Chain)<br>
-    .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),<br>
-               DAG.getExternalSymbol("__trampoline_setup", PtrVT),<br>
-               std::move(Args));<br>
+  CLI.setDebugLoc(dl).setChain(Chain).setLibCallee(<br>
+      CallingConv::C, Type::getVoidTy(*DAG.getContext()),<br>
+      DAG.getExternalSymbol("__trampoline_setup", PtrVT), std::move(Args));<br>
<br>
   std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);<br>
   return CallResult.second;<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=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Fri Mar 17 19:44:07 2017<br>
@@ -53,6 +53,7 @@<br>
 #include "llvm/Support/Debug.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
 #include "llvm/Support/MathExtras.h"<br>
+#include "llvm/Target/TargetLowering.h"<br>
 #include "llvm/Target/TargetOptions.h"<br>
 #include <algorithm><br>
 #include <bitset><br>
@@ -1961,6 +1962,34 @@ bool X86TargetLowering::useSoftFloat() c<br>
   return Subtarget.useSoftFloat();<br>
 }<br>
<br>
+void X86TargetLowering::markLibCallAttributes(MachineFunction *MF, unsigned CC,<br>
+                                              ArgListTy &Args) const {<br>
+<br>
+  // Only relabel X86-32 for C / Stdcall CCs.<br>
+  if (static_cast<const X86Subtarget &>(MF->getSubtarget()).is64Bit())<br>
+    return;<br>
+  if (CC != CallingConv::C && CC != CallingConv::X86_StdCall)<br>
+    return;<br>
+  unsigned ParamRegs = 0;<br>
+  if (auto *M = MF->getFunction()->getParent())<br>
+    ParamRegs = M->getNumberRegisterParameters();<br>
+<br>
+  // Mark the first N int arguments as having reg<br>
+  for (unsigned Idx = 0; Idx < Args.size(); Idx++) {<br>
+    Type *T = Args[Idx].Ty;<br>
+    if (T->isPointerTy() || T->isIntegerTy())<br>
+      if (MF->getDataLayout().getTypeAllocSize(T) <= 8) {<br>
+        unsigned numRegs = 1;<br>
+        if (MF->getDataLayout().getTypeAllocSize(T) > 4)<br>
+          numRegs = 2;<br>
+        if (ParamRegs < numRegs)<br>
+          return;<br>
+        ParamRegs -= numRegs;<br>
+        Args[Idx].IsInReg = true;<br>
+      }<br>
+  }<br>
+}<br>
+<br>
 const MCExpr *<br>
 X86TargetLowering::LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI,<br>
                                              const MachineBasicBlock *MBB,<br>
@@ -21517,11 +21546,15 @@ SDValue X86TargetLowering::LowerWin64_i1<br>
                                          getPointerTy(DAG.getDataLayout()));<br>
<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(dl).setChain(InChain)<br>
-    .setCallee(getLibcallCallingConv(LC),<br>
-               static_cast<EVT>(MVT::v2i64).getTypeForEVT(*DAG.getContext()),<br>
-               Callee, std::move(Args))<br>
-    .setInRegister().setSExtResult(isSigned).setZExtResult(!isSigned);<br>
+  CLI.setDebugLoc(dl)<br>
+      .setChain(InChain)<br>
+      .setLibCallee(<br>
+          getLibcallCallingConv(LC),<br>
+          static_cast<EVT>(MVT::v2i64).getTypeForEVT(*DAG.getContext()), Callee,<br>
+          std::move(Args))<br>
+      .setInRegister()<br>
+      .setSExtResult(isSigned)<br>
+      .setZExtResult(!isSigned);<br>
<br>
   std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);<br>
   return DAG.getBitcast(VT, CallInfo.first);<br>
@@ -23245,8 +23278,9 @@ static SDValue LowerFSINCOS(SDValue Op,<br>
     : (Type*)VectorType::get(ArgTy, 4);<br>
<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(dl).setChain(DAG.getEntryNode())<br>
-    .setCallee(CallingConv::C, RetTy, Callee, std::move(Args));<br>
+  CLI.setDebugLoc(dl)<br>
+      .setChain(DAG.getEntryNode())<br>
+      .setLibCallee(CallingConv::C, RetTy, Callee, std::move(Args));<br>
<br>
   std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);<br>
<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.h?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.h?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86ISelLowering.h (original)<br>
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.h Fri Mar 17 19:44:07 2017<br>
@@ -688,6 +688,9 @@ namespace llvm {<br>
     unsigned getJumpTableEncoding() const override;<br>
     bool useSoftFloat() const override;<br>
<br>
+    void markLibCallAttributes(MachineFunction *MF, unsigned CC,<br>
+                               ArgListTy &Args) const override;<br>
+<br>
     MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {<br>
       return MVT::i8;<br>
     }<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86SelectionDAGInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86SelectionDAGInfo.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86SelectionDAGInfo.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86SelectionDAGInfo.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86SelectionDAGInfo.cpp Fri Mar 17 19:44:07 2017<br>
@@ -87,8 +87,9 @@ SDValue X86SelectionDAGInfo::EmitTargetC<br>
       TargetLowering::CallLoweringInfo CLI(DAG);<br>
       CLI.setDebugLoc(dl)<br>
           .setChain(Chain)<br>
-          .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),<br>
-                     DAG.getExternalSymbol(bzeroEntry, IntPtr), std::move(Args))<br>
+          .setLibCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),<br>
+                        DAG.getExternalSymbol(bzeroEntry, IntPtr),<br>
+                        std::move(Args))<br>
           .setDiscardResult();<br>
<br>
       std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);<br>
<br>
Modified: llvm/trunk/lib/Target/XCore/XCoreISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreISelLowering.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/XCore/XCoreISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/XCore/XCoreISelLowering.cpp Fri Mar 17 19:44:07 2017<br>
@@ -483,7 +483,7 @@ LowerLOAD(SDValue Op, SelectionDAG &DAG)<br>
   Args.push_back(Entry);<br>
<br>
   TargetLowering::CallLoweringInfo CLI(DAG);<br>
-  CLI.setDebugLoc(DL).setChain(Chain).setCallee(<br>
+  CLI.setDebugLoc(DL).setChain(Chain).setLibCallee(<br>
       CallingConv::C, IntPtrTy,<br>
       DAG.getExternalSymbol("__misaligned_load",<br>
                             getPointerTy(DAG.getDataLayout())),<br>
<br>
Modified: llvm/trunk/lib/Target/XCore/XCoreSelectionDAGInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreSelectionDAGInfo.cpp?rev=298179&r1=298178&r2=298179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreSelectionDAGInfo.cpp?rev=298179&r1=298178&r2=298179&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/XCore/XCoreSelectionDAGInfo.cpp (original)<br>
+++ llvm/trunk/lib/Target/XCore/XCoreSelectionDAGInfo.cpp Fri Mar 17 19:44:07 2017<br>
@@ -35,11 +35,11 @@ SDValue XCoreSelectionDAGInfo::EmitTarge<br>
     TargetLowering::CallLoweringInfo CLI(DAG);<br>
     CLI.setDebugLoc(dl)<br>
         .setChain(Chain)<br>
-        .setCallee(TLI.getLibcallCallingConv(RTLIB::MEMCPY),<br>
-                   Type::getVoidTy(*DAG.getContext()),<br>
-                   DAG.getExternalSymbol("__memcpy_4",<br>
-                                         TLI.getPointerTy(DAG.getDataLayout())),<br>
-                   std::move(Args))<br>
+        .setLibCallee(TLI.getLibcallCallingConv(RTLIB::MEMCPY),<br>
+                      Type::getVoidTy(*DAG.getContext()),<br>
+                      DAG.getExternalSymbol(<br>
+                          "__memcpy_4", TLI.getPointerTy(DAG.getDataLayout())),<br>
+                      std::move(Args))<br>
         .setDiscardResult();<br>
<br>
     std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/regparm.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/regparm.ll?rev=298179&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/regparm.ll?rev=298179&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/regparm.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/regparm.ll Fri Mar 17 19:44:07 2017<br>
@@ -0,0 +1,48 @@<br>
+; RUN: llc %s -mtriple=i386-pc-linux -o - | FileCheck -check-prefix=CHECK %s<br>
+; RUN: llc %s -mtriple=i386-pc-win32 -o - | FileCheck -check-prefix=WIN %s<br>
+; RUN: llc %s -mtriple=i386-pc-linux -fast-isel -o - | FileCheck -check-prefix=FAST %s<br>
+; RUN: llc %s -mtriple=i386-pc-win32 -fast-isel -o - | FileCheck -check-prefix=FASTWIN %s<br>
+<br>
+<br>
+<br>
+target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"<br>
+target triple = "i386-unknown-linux-gnu"<br>
+<br>
+; Function Attrs: argmemonly nounwind<br>
+declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture readonly, i32, i32, i1) #1<br>
+<br>
+define void @use_memset(i8* inreg nocapture %dest, i8 inreg %c, i32 inreg %n) local_unnamed_addr #0 {<br>
+entry:<br>
+;CHECK-LABEL: @use_memset<br>
+;CHECK-NOT: push<br>
+;CHECK: jmp    memset<br>
+;CHECK-NOT: retl<br>
+;WIN-LABEL: @use_memset<br>
+;WIN-NOT: push<br>
+;WIN: jmp      _memset<br>
+;WIN-NOT: retl<br>
+;FAST-LABEL: @use_memset<br>
+;FAST: subl    $12, %esp<br>
+;FAST-NEXT:    movzbl  %dl, %edx<br>
+;FAST-NEXT:     calll  memset<br>
+;FAST-NEXT:    addl    $12, %esp<br>
+;FASTWIN-LABEL: @use_memset<br>
+;FASTWIN:      movzbl  %dl, %edx<br>
+;FASTWIN-NEXT:     calll       _memset<br>
+;FASTWIN-NEXT:     retl<br>
+  tail call void @llvm.memset.p0i8.i32(i8* %dest, i8 %c, i32 %n, i32 1, i1 false)<br>
+  ret void<br>
+}<br>
+<br>
+; Function Attrs: argmemonly nounwind<br>
+declare void @llvm.memset.p0i8.i32(i8* nocapture writeonly, i8, i32, i32, i1) #1<br>
+<br>
+<br>
+attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }<br>
+attributes #1 = { argmemonly nounwind }<br>
+<br>
+!llvm.module.flags = !{!0}<br>
+!llvm.ident = !{!1}<br>
+<br>
+!0 = !{i32 1, !"NumRegisterParameters", i32 3}<br>
+!1 = !{!"clang version 4.0.0 (trunk 288025) (llvm/trunk 288033)"}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div>