Commit 681ad610 authored by Tom Stellard's avatar Tom Stellard
Browse files

Merging r298179:

-----------------------------------------------------------------------
r298179 | niravd | 2017-03-17 20:44:07 -0400 (Fri, 17 Mar 2017) | 7 lines

Make library calls sensitive to regparm module flag (Fixes PR3997).

Reviewers: mkuper, rnk

Subscribers: mehdi_amini, jyknight, aemerson, llvm-commits, rengolin

Differential Revision: https://reviews.llvm.org/D27050
------------------------------------------------------------------------

llvm-svn: 304242
parent 85556b07
Loading
Loading
Loading
Loading
+41 −0
Original line number Diff line number Diff line
@@ -57,6 +57,47 @@ public:
  };
  typedef std::vector<ArgListEntry> ArgListTy;

  // This is a workaround to not move around the ArgListEntryTypes.
  void markFastLibCallAttributes(const TargetLowering &TL, MachineFunction *MF,
                                 unsigned CC, ArgListTy &Args) const {

    TargetLowering::ArgListTy TLArgs;
    // Convert to TargetLowering::ArgListTy
    for (unsigned long i = 0; i < Args.size(); ++i) {
      TargetLowering::ArgListEntry TArg;
      TArg.Ty = Args[i].Ty;
      TArg.isSExt = Args[i].IsSExt;
      TArg.isZExt = Args[i].IsZExt;
      TArg.isInReg = Args[i].IsInReg;
      TArg.isSRet = Args[i].IsSRet;
      TArg.isNest = Args[i].IsNest;
      TArg.isByVal = Args[i].IsByVal;
      TArg.isInAlloca = Args[i].IsInAlloca;
      TArg.isReturned = Args[i].IsReturned;
      TArg.isSwiftSelf = Args[i].IsSwiftSelf;
      TArg.isSwiftError = Args[i].IsSwiftError;
      TArg.Alignment = Args[i].Alignment;
      TLArgs.push_back(TArg);
    }
    // Call convered
    TL.markLibCallAttributes(MF, CC, TLArgs);
    // Copy back.
    for (unsigned long i = 0; i < Args.size(); ++i) {
      Args[i].Ty = TLArgs[i].Ty;
      Args[i].IsSExt = TLArgs[i].isSExt;
      Args[i].IsZExt = TLArgs[i].isZExt;
      Args[i].IsInReg = TLArgs[i].isInReg;
      Args[i].IsSRet = TLArgs[i].isSRet;
      Args[i].IsNest = TLArgs[i].isNest;
      Args[i].IsByVal = TLArgs[i].isByVal;
      Args[i].IsInAlloca = TLArgs[i].isInAlloca;
      Args[i].IsReturned = TLArgs[i].isReturned;
      Args[i].IsSwiftSelf = TLArgs[i].isSwiftSelf;
      Args[i].IsSwiftError = TLArgs[i].isSwiftError;
      Args[i].Alignment = TLArgs[i].Alignment;
    }
  }

  struct CallLoweringInfo {
    Type *RetTy;
    bool RetSExt : 1;
+4 −0
Original line number Diff line number Diff line
@@ -726,6 +726,10 @@ public:
/// @name Utility functions for querying Debug information.
/// @{

  /// \brief Returns the Number of Register ParametersDwarf Version by checking
  /// module flags.
  unsigned getNumberRegisterParameters() const;

  /// \brief Returns the Dwarf Version by checking module flags.
  unsigned getDwarfVersion() const;

+19 −1
Original line number Diff line number Diff line
@@ -25,13 +25,14 @@

#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/CodeGen/DAGCombine.h"
#include "llvm/CodeGen/ISDOpcodes.h"
#include "llvm/CodeGen/MachineValueType.h"
#include "llvm/CodeGen/RuntimeLibcalls.h"
#include "llvm/CodeGen/SelectionDAG.h"
#include "llvm/CodeGen/SelectionDAGNodes.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/IR/Attributes.h"
@@ -2560,6 +2561,9 @@ public:
  };
  typedef std::vector<ArgListEntry> ArgListTy;

  virtual void markLibCallAttributes(MachineFunction *MF, unsigned CC,
                                     ArgListTy &Args) const {};

  /// This structure contains all information that is necessary for lowering
  /// calls. It is passed to TLI::LowerCallTo when the SelectionDAG builder
  /// needs to lower a call, and targets will see this struct in their LowerCall
@@ -2609,6 +2613,20 @@ public:
      return *this;
    }

    // setCallee with target/module-specific attributes
    CallLoweringInfo &setLibCallee(CallingConv::ID CC, Type *ResultType,
                                   SDValue Target, ArgListTy &&ArgsList) {
      RetTy = ResultType;
      Callee = Target;
      CallConv = CC;
      NumFixedArgs = Args.size();
      Args = std::move(ArgsList);

      DAG.getTargetLoweringInfo().markLibCallAttributes(
          &(DAG.getMachineFunction()), CC, Args);
      return *this;
    }

    CallLoweringInfo &setCallee(CallingConv::ID CC, Type *ResultType,
                                SDValue Target, ArgListTy &&ArgsList) {
      RetTy = ResultType;
+2 −0
Original line number Diff line number Diff line
@@ -888,6 +888,8 @@ bool FastISel::lowerCallTo(const CallInst *CI, MCSymbol *Symbol,
    Entry.setAttributes(&CS, ArgI + 1);
    Args.push_back(Entry);
  }
  markFastLibCallAttributes(*MF->getSubtarget().getTargetLowering(), MF,
                            CS.getCallingConv(), Args);

  CallLoweringInfo CLI;
  CLI.setCallee(RetTy, FTy, Symbol, std::move(Args), CS, NumArgs);
+37 −23
Original line number Diff line number Diff line
@@ -1935,9 +1935,13 @@ SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,
    InChain = TCChain;

  TargetLowering::CallLoweringInfo CLI(DAG);
  CLI.setDebugLoc(SDLoc(Node)).setChain(InChain)
    .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))
    .setTailCall(isTailCall).setSExtResult(isSigned).setZExtResult(!isSigned);
  CLI.setDebugLoc(SDLoc(Node))
      .setChain(InChain)
      .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,
                    std::move(Args))
      .setTailCall(isTailCall)
      .setSExtResult(isSigned)
      .setZExtResult(!isSigned);

  std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);

@@ -1970,9 +1974,12 @@ SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, EVT RetVT,
  Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());

  TargetLowering::CallLoweringInfo CLI(DAG);
  CLI.setDebugLoc(dl).setChain(DAG.getEntryNode())
    .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))
    .setSExtResult(isSigned).setZExtResult(!isSigned);
  CLI.setDebugLoc(dl)
      .setChain(DAG.getEntryNode())
      .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,
                    std::move(Args))
      .setSExtResult(isSigned)
      .setZExtResult(!isSigned);

  std::pair<SDValue,SDValue> CallInfo = TLI.LowerCallTo(CLI);

@@ -2004,9 +2011,12 @@ SelectionDAGLegalize::ExpandChainLibCall(RTLIB::Libcall LC,
  Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext());

  TargetLowering::CallLoweringInfo CLI(DAG);
  CLI.setDebugLoc(SDLoc(Node)).setChain(InChain)
    .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))
    .setSExtResult(isSigned).setZExtResult(!isSigned);
  CLI.setDebugLoc(SDLoc(Node))
      .setChain(InChain)
      .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,
                    std::move(Args))
      .setSExtResult(isSigned)
      .setZExtResult(!isSigned);

  std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);

@@ -2099,9 +2109,12 @@ SelectionDAGLegalize::ExpandDivRemLibCall(SDNode *Node,

  SDLoc dl(Node);
  TargetLowering::CallLoweringInfo CLI(DAG);
  CLI.setDebugLoc(dl).setChain(InChain)
    .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))
    .setSExtResult(isSigned).setZExtResult(!isSigned);
  CLI.setDebugLoc(dl)
      .setChain(InChain)
      .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,
                    std::move(Args))
      .setSExtResult(isSigned)
      .setZExtResult(!isSigned);

  std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);

@@ -2210,9 +2223,9 @@ SelectionDAGLegalize::ExpandSinCosLibCall(SDNode *Node,

  SDLoc dl(Node);
  TargetLowering::CallLoweringInfo CLI(DAG);
  CLI.setDebugLoc(dl).setChain(InChain)
    .setCallee(TLI.getLibcallCallingConv(LC),
               Type::getVoidTy(*DAG.getContext()), Callee, std::move(Args));
  CLI.setDebugLoc(dl).setChain(InChain).setLibCallee(
      TLI.getLibcallCallingConv(LC), Type::getVoidTy(*DAG.getContext()), Callee,
      std::move(Args));

  std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);

@@ -3830,7 +3843,8 @@ void SelectionDAGLegalize::ConvertNodeToLibcall(SDNode *Node) {
    TargetLowering::CallLoweringInfo CLI(DAG);
    CLI.setDebugLoc(dl)
        .setChain(Node->getOperand(0))
        .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
        .setLibCallee(
            CallingConv::C, Type::getVoidTy(*DAG.getContext()),
            DAG.getExternalSymbol("__sync_synchronize",
                                  TLI.getPointerTy(DAG.getDataLayout())),
            std::move(Args));
@@ -3870,9 +3884,9 @@ void SelectionDAGLegalize::ConvertNodeToLibcall(SDNode *Node) {
    TargetLowering::CallLoweringInfo CLI(DAG);
    CLI.setDebugLoc(dl)
        .setChain(Node->getOperand(0))
        .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
                   DAG.getExternalSymbol("abort",
                                         TLI.getPointerTy(DAG.getDataLayout())),
        .setLibCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
                      DAG.getExternalSymbol(
                          "abort", TLI.getPointerTy(DAG.getDataLayout())),
                      std::move(Args));
    std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);

Loading