mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-27 13:40:30 +00:00
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298179 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c78bc912e4
commit
11fdc7845a
@ -41,32 +41,8 @@ class MachineConstantPool;
|
||||
/// quickly.
|
||||
class FastISel {
|
||||
public:
|
||||
struct ArgListEntry {
|
||||
Value *Val = nullptr;
|
||||
Type *Ty = nullptr;
|
||||
bool IsSExt : 1;
|
||||
bool IsZExt : 1;
|
||||
bool IsInReg : 1;
|
||||
bool IsSRet : 1;
|
||||
bool IsNest : 1;
|
||||
bool IsByVal : 1;
|
||||
bool IsInAlloca : 1;
|
||||
bool IsReturned : 1;
|
||||
bool IsSwiftSelf : 1;
|
||||
bool IsSwiftError : 1;
|
||||
uint16_t Alignment = 0;
|
||||
|
||||
ArgListEntry()
|
||||
: IsSExt(false), IsZExt(false), IsInReg(false), IsSRet(false),
|
||||
IsNest(false), IsByVal(false), IsInAlloca(false), IsReturned(false),
|
||||
IsSwiftSelf(false), IsSwiftError(false) {}
|
||||
|
||||
/// \brief Set CallLoweringInfo attribute flags based on a call instruction
|
||||
/// and called function attributes.
|
||||
void setAttributes(ImmutableCallSite *CS, unsigned AttrIdx);
|
||||
};
|
||||
typedef std::vector<ArgListEntry> ArgListTy;
|
||||
|
||||
typedef TargetLoweringBase::ArgListEntry ArgListEntry;
|
||||
typedef TargetLoweringBase::ArgListTy ArgListTy;
|
||||
struct CallLoweringInfo {
|
||||
Type *RetTy = nullptr;
|
||||
bool RetSExt : 1;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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"
|
||||
@ -2628,6 +2629,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;
|
||||
|
@ -119,21 +119,6 @@ STATISTIC(NumFastIselSuccessTarget, "Number of insts selected by "
|
||||
"target-specific selector");
|
||||
STATISTIC(NumFastIselDead, "Number of dead insts removed on failure");
|
||||
|
||||
void FastISel::ArgListEntry::setAttributes(ImmutableCallSite *CS,
|
||||
unsigned AttrIdx) {
|
||||
IsSExt = CS->paramHasAttr(AttrIdx, Attribute::SExt);
|
||||
IsZExt = CS->paramHasAttr(AttrIdx, Attribute::ZExt);
|
||||
IsInReg = CS->paramHasAttr(AttrIdx, Attribute::InReg);
|
||||
IsSRet = CS->paramHasAttr(AttrIdx, Attribute::StructRet);
|
||||
IsNest = CS->paramHasAttr(AttrIdx, Attribute::Nest);
|
||||
IsByVal = CS->paramHasAttr(AttrIdx, Attribute::ByVal);
|
||||
IsInAlloca = CS->paramHasAttr(AttrIdx, Attribute::InAlloca);
|
||||
IsReturned = CS->paramHasAttr(AttrIdx, Attribute::Returned);
|
||||
IsSwiftSelf = CS->paramHasAttr(AttrIdx, Attribute::SwiftSelf);
|
||||
IsSwiftError = CS->paramHasAttr(AttrIdx, Attribute::SwiftError);
|
||||
Alignment = CS->getParamAlignment(AttrIdx);
|
||||
}
|
||||
|
||||
/// Set the current block to which generated machine instructions will be
|
||||
/// appended, and clear the local CSE map.
|
||||
void FastISel::startNewBlock() {
|
||||
@ -929,6 +914,7 @@ bool FastISel::lowerCallTo(const CallInst *CI, MCSymbol *Symbol,
|
||||
Entry.setAttributes(&CS, ArgI + 1);
|
||||
Args.push_back(Entry);
|
||||
}
|
||||
TLI.markLibCallAttributes(MF, CS.getCallingConv(), Args);
|
||||
|
||||
CallLoweringInfo CLI;
|
||||
CLI.setCallee(RetTy, FTy, Symbol, std::move(Args), CS, NumArgs);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -2607,7 +2607,7 @@ void DAGTypeLegalizer::ExpandIntRes_XMULO(SDNode *N,
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(TLI.getLibcallCallingConv(LC), RetTy, Func, std::move(Args))
|
||||
.setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Func, std::move(Args))
|
||||
.setSExtResult();
|
||||
|
||||
std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
|
||||
|
@ -1094,9 +1094,12 @@ DAGTypeLegalizer::ExpandChainLibCall(RTLIB::Libcall LC, SDNode *Node,
|
||||
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);
|
||||
|
||||
|
@ -5175,7 +5175,7 @@ SDValue SelectionDAG::getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
TargetLowering::CallLoweringInfo CLI(*this);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY),
|
||||
.setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY),
|
||||
Dst.getValueType().getTypeForEVT(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY),
|
||||
TLI->getPointerTy(getDataLayout())),
|
||||
@ -5236,7 +5236,7 @@ SDValue SelectionDAG::getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
TargetLowering::CallLoweringInfo CLI(*this);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE),
|
||||
.setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE),
|
||||
Dst.getValueType().getTypeForEVT(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE),
|
||||
TLI->getPointerTy(getDataLayout())),
|
||||
@ -5298,7 +5298,7 @@ SDValue SelectionDAG::getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
TargetLowering::CallLoweringInfo CLI(*this);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET),
|
||||
.setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET),
|
||||
Dst.getValueType().getTypeForEVT(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET),
|
||||
TLI->getPointerTy(getDataLayout())),
|
||||
|
@ -4912,7 +4912,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
report_fatal_error("Unsupported element size");
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(sdl).setChain(getRoot()).setCallee(
|
||||
CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
|
||||
TLI.getLibcallCallingConv(LibraryCall),
|
||||
Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(TLI.getLibcallName(LibraryCall),
|
||||
@ -5536,7 +5536,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
TargetLowering::ArgListTy Args;
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(sdl).setChain(getRoot()).setCallee(
|
||||
CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
|
||||
CallingConv::C, I.getType(),
|
||||
DAG.getExternalSymbol(TrapFuncName.data(),
|
||||
TLI.getPointerTy(DAG.getDataLayout())),
|
||||
|
@ -96,7 +96,7 @@ bool TargetLowering::parametersInCSRMatch(const MachineRegisterInfo &MRI,
|
||||
|
||||
/// \brief Set CallLoweringInfo attribute flags based on a call instruction
|
||||
/// and called function attributes.
|
||||
void TargetLowering::ArgListEntry::setAttributes(ImmutableCallSite *CS,
|
||||
void TargetLoweringBase::ArgListEntry::setAttributes(ImmutableCallSite *CS,
|
||||
unsigned AttrIdx) {
|
||||
IsSExt = CS->paramHasAttr(AttrIdx, Attribute::SExt);
|
||||
IsZExt = CS->paramHasAttr(AttrIdx, Attribute::ZExt);
|
||||
@ -138,10 +138,13 @@ TargetLowering::makeLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, EVT RetVT,
|
||||
Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
bool signExtend = shouldSignExtendTypeInLibCall(RetVT, isSigned);
|
||||
CLI.setDebugLoc(dl).setChain(DAG.getEntryNode())
|
||||
.setCallee(getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))
|
||||
.setNoReturn(doesNotReturn).setDiscardResult(!isReturnValueUsed)
|
||||
.setSExtResult(signExtend).setZExtResult(!signExtend);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(DAG.getEntryNode())
|
||||
.setLibCallee(getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))
|
||||
.setNoReturn(doesNotReturn)
|
||||
.setDiscardResult(!isReturnValueUsed)
|
||||
.setSExtResult(signExtend)
|
||||
.setZExtResult(!signExtend);
|
||||
return LowerCallTo(CLI);
|
||||
}
|
||||
|
||||
@ -3853,7 +3856,7 @@ SDValue TargetLowering::LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA,
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(DAG.getEntryNode());
|
||||
CLI.setCallee(CallingConv::C, VoidPtrType, EmuTlsGetAddr, std::move(Args));
|
||||
CLI.setLibCallee(CallingConv::C, VoidPtrType, EmuTlsGetAddr, std::move(Args));
|
||||
std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
|
||||
|
||||
// TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
|
||||
|
@ -465,6 +465,14 @@ void Module::dropAllReferences() {
|
||||
GIF.dropAllReferences();
|
||||
}
|
||||
|
||||
unsigned Module::getNumberRegisterParameters() const {
|
||||
auto *Val =
|
||||
cast_or_null<ConstantAsMetadata>(getModuleFlag("NumRegisterParameters"));
|
||||
if (!Val)
|
||||
return 0;
|
||||
return cast<ConstantInt>(Val->getValue())->getZExtValue();
|
||||
}
|
||||
|
||||
unsigned Module::getDwarfVersion() const {
|
||||
auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("Dwarf Version"));
|
||||
if (!Val)
|
||||
|
@ -2123,8 +2123,9 @@ SDValue AArch64TargetLowering::LowerFSINCOS(SDValue Op,
|
||||
|
||||
StructType *RetTy = StructType::get(ArgTy, ArgTy, nullptr);
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(DAG.getEntryNode())
|
||||
.setCallee(CallingConv::Fast, RetTy, Callee, std::move(Args));
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(DAG.getEntryNode())
|
||||
.setLibCallee(CallingConv::Fast, RetTy, Callee, std::move(Args));
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
|
||||
return CallResult.first;
|
||||
|
@ -44,8 +44,9 @@ SDValue AArch64SelectionDAGInfo::EmitTargetCodeForMemset(
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(bzeroEntry, IntPtr), std::move(Args))
|
||||
.setLibCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(bzeroEntry, IntPtr),
|
||||
std::move(Args))
|
||||
.setDiscardResult();
|
||||
std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
|
||||
return CallResult.second;
|
||||
|
@ -2873,7 +2873,7 @@ ARMTargetLowering::LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA,
|
||||
|
||||
// FIXME: is there useful debug info available here?
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(Chain).setCallee(
|
||||
CLI.setDebugLoc(dl).setChain(Chain).setLibCallee(
|
||||
CallingConv::C, Type::getInt32Ty(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("__tls_get_addr", PtrVT), std::move(Args));
|
||||
|
||||
|
@ -114,7 +114,7 @@ SDValue ARMSelectionDAGInfo::EmitSpecializedLibcall(
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(
|
||||
.setLibCallee(
|
||||
TLI->getLibcallCallingConv(LC), Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(FunctionNames[AEABILibcall][AlignVariant],
|
||||
TLI->getPointerTy(DAG.getDataLayout())),
|
||||
|
@ -356,7 +356,7 @@ SDValue AVRTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(InChain)
|
||||
.setCallee(getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))
|
||||
.setLibCallee(getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))
|
||||
.setInRegister()
|
||||
.setSExtResult(isSigned)
|
||||
.setZExtResult(!isSigned);
|
||||
@ -1983,4 +1983,3 @@ unsigned AVRTargetLowering::getRegisterByName(const char *RegName,
|
||||
}
|
||||
|
||||
} // end of namespace llvm
|
||||
|
||||
|
@ -51,7 +51,7 @@ SDValue HexagonSelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(
|
||||
.setLibCallee(
|
||||
TLI.getLibcallCallingConv(RTLIB::MEMCPY),
|
||||
Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getTargetExternalSymbol(
|
||||
|
@ -1922,8 +1922,9 @@ lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
|
||||
Args.push_back(Entry);
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(DL).setChain(DAG.getEntryNode())
|
||||
.setCallee(CallingConv::C, PtrTy, TlsGetAddr, std::move(Args));
|
||||
CLI.setDebugLoc(DL)
|
||||
.setChain(DAG.getEntryNode())
|
||||
.setLibCallee(CallingConv::C, PtrTy, TlsGetAddr, std::move(Args));
|
||||
std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
|
||||
|
||||
SDValue Ret = CallResult.first;
|
||||
|
@ -2647,10 +2647,9 @@ SDValue PPCTargetLowering::LowerINIT_TRAMPOLINE(SDValue Op,
|
||||
|
||||
// Lower to a call to __trampoline_setup(Trmp, TrampSize, FPtr, ctx_reg)
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(Chain)
|
||||
.setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("__trampoline_setup", PtrVT),
|
||||
std::move(Args));
|
||||
CLI.setDebugLoc(dl).setChain(Chain).setLibCallee(
|
||||
CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("__trampoline_setup", PtrVT), std::move(Args));
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
|
||||
return CallResult.second;
|
||||
|
@ -53,6 +53,7 @@
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include <algorithm>
|
||||
#include <bitset>
|
||||
@ -1961,6 +1962,34 @@ bool X86TargetLowering::useSoftFloat() const {
|
||||
return Subtarget.useSoftFloat();
|
||||
}
|
||||
|
||||
void X86TargetLowering::markLibCallAttributes(MachineFunction *MF, unsigned CC,
|
||||
ArgListTy &Args) const {
|
||||
|
||||
// Only relabel X86-32 for C / Stdcall CCs.
|
||||
if (static_cast<const X86Subtarget &>(MF->getSubtarget()).is64Bit())
|
||||
return;
|
||||
if (CC != CallingConv::C && CC != CallingConv::X86_StdCall)
|
||||
return;
|
||||
unsigned ParamRegs = 0;
|
||||
if (auto *M = MF->getFunction()->getParent())
|
||||
ParamRegs = M->getNumberRegisterParameters();
|
||||
|
||||
// Mark the first N int arguments as having reg
|
||||
for (unsigned Idx = 0; Idx < Args.size(); Idx++) {
|
||||
Type *T = Args[Idx].Ty;
|
||||
if (T->isPointerTy() || T->isIntegerTy())
|
||||
if (MF->getDataLayout().getTypeAllocSize(T) <= 8) {
|
||||
unsigned numRegs = 1;
|
||||
if (MF->getDataLayout().getTypeAllocSize(T) > 4)
|
||||
numRegs = 2;
|
||||
if (ParamRegs < numRegs)
|
||||
return;
|
||||
ParamRegs -= numRegs;
|
||||
Args[Idx].IsInReg = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const MCExpr *
|
||||
X86TargetLowering::LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI,
|
||||
const MachineBasicBlock *MBB,
|
||||
@ -21517,11 +21546,15 @@ SDValue X86TargetLowering::LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) cons
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(InChain)
|
||||
.setCallee(getLibcallCallingConv(LC),
|
||||
static_cast<EVT>(MVT::v2i64).getTypeForEVT(*DAG.getContext()),
|
||||
Callee, std::move(Args))
|
||||
.setInRegister().setSExtResult(isSigned).setZExtResult(!isSigned);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(InChain)
|
||||
.setLibCallee(
|
||||
getLibcallCallingConv(LC),
|
||||
static_cast<EVT>(MVT::v2i64).getTypeForEVT(*DAG.getContext()), Callee,
|
||||
std::move(Args))
|
||||
.setInRegister()
|
||||
.setSExtResult(isSigned)
|
||||
.setZExtResult(!isSigned);
|
||||
|
||||
std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
|
||||
return DAG.getBitcast(VT, CallInfo.first);
|
||||
@ -23245,8 +23278,9 @@ static SDValue LowerFSINCOS(SDValue Op, const X86Subtarget &Subtarget,
|
||||
: (Type*)VectorType::get(ArgTy, 4);
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl).setChain(DAG.getEntryNode())
|
||||
.setCallee(CallingConv::C, RetTy, Callee, std::move(Args));
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(DAG.getEntryNode())
|
||||
.setLibCallee(CallingConv::C, RetTy, Callee, std::move(Args));
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
|
||||
|
||||
|
@ -688,6 +688,9 @@ namespace llvm {
|
||||
unsigned getJumpTableEncoding() const override;
|
||||
bool useSoftFloat() const override;
|
||||
|
||||
void markLibCallAttributes(MachineFunction *MF, unsigned CC,
|
||||
ArgListTy &Args) const override;
|
||||
|
||||
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
|
||||
return MVT::i8;
|
||||
}
|
||||
|
@ -87,8 +87,9 @@ SDValue X86SelectionDAGInfo::EmitTargetCodeForMemset(
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(bzeroEntry, IntPtr), std::move(Args))
|
||||
.setLibCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(bzeroEntry, IntPtr),
|
||||
std::move(Args))
|
||||
.setDiscardResult();
|
||||
|
||||
std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);
|
||||
|
@ -483,7 +483,7 @@ LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
|
||||
Args.push_back(Entry);
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(DL).setChain(Chain).setCallee(
|
||||
CLI.setDebugLoc(DL).setChain(Chain).setLibCallee(
|
||||
CallingConv::C, IntPtrTy,
|
||||
DAG.getExternalSymbol("__misaligned_load",
|
||||
getPointerTy(DAG.getDataLayout())),
|
||||
|
@ -35,10 +35,10 @@ SDValue XCoreSelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setCallee(TLI.getLibcallCallingConv(RTLIB::MEMCPY),
|
||||
.setLibCallee(TLI.getLibcallCallingConv(RTLIB::MEMCPY),
|
||||
Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol("__memcpy_4",
|
||||
TLI.getPointerTy(DAG.getDataLayout())),
|
||||
DAG.getExternalSymbol(
|
||||
"__memcpy_4", TLI.getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args))
|
||||
.setDiscardResult();
|
||||
|
||||
|
48
test/CodeGen/X86/regparm.ll
Normal file
48
test/CodeGen/X86/regparm.ll
Normal file
@ -0,0 +1,48 @@
|
||||
; RUN: llc %s -mtriple=i386-pc-linux -o - | FileCheck -check-prefix=CHECK %s
|
||||
; RUN: llc %s -mtriple=i386-pc-win32 -o - | FileCheck -check-prefix=WIN %s
|
||||
; RUN: llc %s -mtriple=i386-pc-linux -fast-isel -o - | FileCheck -check-prefix=FAST %s
|
||||
; RUN: llc %s -mtriple=i386-pc-win32 -fast-isel -o - | FileCheck -check-prefix=FASTWIN %s
|
||||
|
||||
|
||||
|
||||
target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
|
||||
target triple = "i386-unknown-linux-gnu"
|
||||
|
||||
; Function Attrs: argmemonly nounwind
|
||||
declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture readonly, i32, i32, i1) #1
|
||||
|
||||
define void @use_memset(i8* inreg nocapture %dest, i8 inreg %c, i32 inreg %n) local_unnamed_addr #0 {
|
||||
entry:
|
||||
;CHECK-LABEL: @use_memset
|
||||
;CHECK-NOT: push
|
||||
;CHECK: jmp memset
|
||||
;CHECK-NOT: retl
|
||||
;WIN-LABEL: @use_memset
|
||||
;WIN-NOT: push
|
||||
;WIN: jmp _memset
|
||||
;WIN-NOT: retl
|
||||
;FAST-LABEL: @use_memset
|
||||
;FAST: subl $12, %esp
|
||||
;FAST-NEXT: movzbl %dl, %edx
|
||||
;FAST-NEXT: calll memset
|
||||
;FAST-NEXT: addl $12, %esp
|
||||
;FASTWIN-LABEL: @use_memset
|
||||
;FASTWIN: movzbl %dl, %edx
|
||||
;FASTWIN-NEXT: calll _memset
|
||||
;FASTWIN-NEXT: retl
|
||||
tail call void @llvm.memset.p0i8.i32(i8* %dest, i8 %c, i32 %n, i32 1, i1 false)
|
||||
ret void
|
||||
}
|
||||
|
||||
; Function Attrs: argmemonly nounwind
|
||||
declare void @llvm.memset.p0i8.i32(i8* nocapture writeonly, i8, i32, i32, i1) #1
|
||||
|
||||
|
||||
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" }
|
||||
attributes #1 = { argmemonly nounwind }
|
||||
|
||||
!llvm.module.flags = !{!0}
|
||||
!llvm.ident = !{!1}
|
||||
|
||||
!0 = !{i32 1, !"NumRegisterParameters", i32 3}
|
||||
!1 = !{!"clang version 4.0.0 (trunk 288025) (llvm/trunk 288033)"}
|
Loading…
Reference in New Issue
Block a user