Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 14 additions & 9 deletions llvm/include/llvm/CodeGen/TargetLowering.h
Original file line number Diff line number Diff line change
Expand Up @@ -299,9 +299,9 @@ class LLVM_ABI TargetLoweringBase {

class ArgListEntry {
public:
Value *Val = nullptr;
SDValue Node = SDValue();
Type *Ty = nullptr;
Value *Val;
SDValue Node;
Type *Ty;
bool IsSExt : 1;
bool IsZExt : 1;
bool IsNoExt : 1;
Expand All @@ -320,12 +320,17 @@ class LLVM_ABI TargetLoweringBase {
MaybeAlign Alignment = std::nullopt;
Type *IndirectType = nullptr;

ArgListEntry()
: IsSExt(false), IsZExt(false), IsNoExt(false), IsInReg(false),
IsSRet(false), IsNest(false), IsByVal(false), IsByRef(false),
IsInAlloca(false), IsPreallocated(false), IsReturned(false),
IsSwiftSelf(false), IsSwiftAsync(false), IsSwiftError(false),
IsCFGuardTarget(false) {}
ArgListEntry(Value *Val, SDValue Node, Type *Ty)
: Val(Val), Node(Node), Ty(Ty), IsSExt(false), IsZExt(false),
IsNoExt(false), IsInReg(false), IsSRet(false), IsNest(false),
IsByVal(false), IsByRef(false), IsInAlloca(false),
IsPreallocated(false), IsReturned(false), IsSwiftSelf(false),
IsSwiftAsync(false), IsSwiftError(false), IsCFGuardTarget(false) {}

explicit ArgListEntry(Value *Val, SDValue Node = SDValue())
: ArgListEntry(Val, Node, Val->getType()) {}

ArgListEntry(SDValue Node, Type *Ty) : ArgListEntry(nullptr, Node, Ty) {}

LLVM_ABI void setAttributes(const CallBase *Call, unsigned ArgIdx);
};
Expand Down
13 changes: 3 additions & 10 deletions llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -729,9 +729,7 @@ bool FastISel::lowerCallOperands(const CallInst *CI, unsigned ArgIdx,

assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");

ArgListEntry Entry;
Entry.Val = V;
Entry.Ty = V->getType();
ArgListEntry Entry(V);
Entry.setAttributes(CI, ArgI);
Args.push_back(Entry);
}
Expand Down Expand Up @@ -978,9 +976,7 @@ bool FastISel::lowerCallTo(const CallInst *CI, MCSymbol *Symbol,

assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");

ArgListEntry Entry;
Entry.Val = V;
Entry.Ty = V->getType();
ArgListEntry Entry(V);
Entry.setAttributes(CI, ArgI);
Args.push_back(Entry);
}
Expand Down Expand Up @@ -1116,7 +1112,6 @@ bool FastISel::lowerCall(const CallInst *CI) {
Type *RetTy = CI->getType();

ArgListTy Args;
ArgListEntry Entry;
Args.reserve(CI->arg_size());

for (auto i = CI->arg_begin(), e = CI->arg_end(); i != e; ++i) {
Expand All @@ -1126,9 +1121,7 @@ bool FastISel::lowerCall(const CallInst *CI) {
if (V->getType()->isEmptyTy())
continue;

Entry.Val = V;
Entry.Ty = V->getType();

ArgListEntry Entry(V);
// Skip the first return-type Attribute to get to params.
Entry.setAttributes(CI, i - CI->arg_begin());
Args.push_back(Entry);
Expand Down
16 changes: 5 additions & 11 deletions llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2181,12 +2181,10 @@ SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,
std::pair<SDValue, SDValue> SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,
bool isSigned) {
TargetLowering::ArgListTy Args;
TargetLowering::ArgListEntry Entry;
for (const SDValue &Op : Node->op_values()) {
EVT ArgVT = Op.getValueType();
Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
Entry.Node = Op;
Entry.Ty = ArgTy;
TargetLowering::ArgListEntry Entry(Op, ArgTy);
Entry.IsSExt = TLI.shouldSignExtendTypeInLibCall(ArgTy, isSigned);
Entry.IsZExt = !Entry.IsSExt;
Args.push_back(Entry);
Expand Down Expand Up @@ -2325,11 +2323,9 @@ SDValue SelectionDAGLegalize::ExpandBitCountingLibCall(
EVT IntVT =
EVT::getIntegerVT(*DAG.getContext(), DAG.getLibInfo().getIntSize());

TargetLowering::ArgListEntry Arg;
EVT ArgVT = Op.getValueType();
Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
Arg.Node = Op;
Arg.Ty = ArgTy;
TargetLowering::ArgListEntry Arg(Op, ArgTy);
Arg.IsSExt = TLI.shouldSignExtendTypeInLibCall(ArgTy, /*IsSigned=*/false);
Arg.IsZExt = !Arg.IsSExt;

Expand Down Expand Up @@ -2370,21 +2366,19 @@ SelectionDAGLegalize::ExpandDivRemLibCall(SDNode *Node,
Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());

TargetLowering::ArgListTy Args;
TargetLowering::ArgListEntry Entry;
for (const SDValue &Op : Node->op_values()) {
EVT ArgVT = Op.getValueType();
Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
Entry.Node = Op;
Entry.Ty = ArgTy;
TargetLowering::ArgListEntry Entry(Op, ArgTy);
Entry.IsSExt = isSigned;
Entry.IsZExt = !isSigned;
Args.push_back(Entry);
}

// Also pass the return address of the remainder.
SDValue FIPtr = DAG.CreateStackTemporary(RetVT);
Entry.Node = FIPtr;
Entry.Ty = PointerType::getUnqual(RetTy->getContext());
TargetLowering::ArgListEntry Entry(
FIPtr, PointerType::getUnqual(RetTy->getContext()));
Entry.IsSExt = isSigned;
Entry.IsZExt = !isSigned;
Args.push_back(Entry);
Expand Down
8 changes: 3 additions & 5 deletions llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5260,20 +5260,18 @@ void DAGTypeLegalizer::ExpandIntRes_XMULO(SDNode *N,
MachinePointerInfo());

TargetLowering::ArgListTy Args;
TargetLowering::ArgListEntry Entry;
for (const SDValue &Op : N->op_values()) {
EVT ArgVT = Op.getValueType();
Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
Entry.Node = Op;
Entry.Ty = ArgTy;
TargetLowering::ArgListEntry Entry(Op, ArgTy);
Entry.IsSExt = true;
Entry.IsZExt = false;
Args.push_back(Entry);
}

// Also pass the address of the overflow check.
Entry.Node = Temp;
Entry.Ty = PointerType::getUnqual(PtrTy->getContext());
TargetLowering::ArgListEntry Entry(
Temp, PointerType::getUnqual(PtrTy->getContext()));
Entry.IsSExt = true;
Entry.IsZExt = false;
Args.push_back(Entry);
Expand Down
12 changes: 3 additions & 9 deletions llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2223,27 +2223,21 @@ bool VectorLegalizer::tryExpandVecMathCall(SDNode *Node, RTLIB::Libcall LC,

SDLoc DL(Node);
TargetLowering::ArgListTy Args;
TargetLowering::ArgListEntry Entry;
Entry.IsSExt = false;
Entry.IsZExt = false;

unsigned OpNum = 0;
for (auto &VFParam : OptVFInfo->Shape.Parameters) {
if (VFParam.ParamKind == VFParamKind::GlobalPredicate) {
EVT MaskVT = TLI.getSetCCResultType(DAG.getDataLayout(), *Ctx, VT);
Entry.Node = DAG.getBoolConstant(true, DL, MaskVT, VT);
Entry.Ty = MaskVT.getTypeForEVT(*Ctx);
Args.push_back(Entry);
Args.emplace_back(DAG.getBoolConstant(true, DL, MaskVT, VT),
MaskVT.getTypeForEVT(*Ctx));
continue;
}

// Only vector operands are supported.
if (VFParam.ParamKind != VFParamKind::Vector)
return false;

Entry.Node = Node->getOperand(OpNum++);
Entry.Ty = Ty;
Args.push_back(Entry);
Args.emplace_back(Node->getOperand(OpNum++), Ty);
}

// Emit a call to the vector function.
Expand Down
115 changes: 31 additions & 84 deletions llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2576,18 +2576,12 @@ bool SelectionDAG::expandMultipleResultFPLibCall(
}

TargetLowering::ArgListTy Args;
auto AddArgListEntry = [&](SDValue Node, Type *Ty) {
TargetLowering::ArgListEntry Entry{};
Entry.Ty = Ty;
Entry.Node = Node;
Args.push_back(Entry);
};

// Pass the arguments.
for (const SDValue &Op : Node->op_values()) {
EVT ArgVT = Op.getValueType();
Type *ArgTy = ArgVT.getTypeForEVT(Ctx);
AddArgListEntry(Op, ArgTy);
Args.emplace_back(Op, ArgTy);
}

// Pass the output pointers.
Expand All @@ -2599,7 +2593,7 @@ bool SelectionDAG::expandMultipleResultFPLibCall(
EVT ResVT = Node->getValueType(ResNo);
SDValue ResultPtr = ST ? ST->getBasePtr() : CreateStackTemporary(ResVT);
ResultPtrs[ResNo] = ResultPtr;
AddArgListEntry(ResultPtr, PointerTy);
Args.emplace_back(ResultPtr, PointerTy);
}

SDLoc DL(Node);
Expand All @@ -2608,7 +2602,7 @@ bool SelectionDAG::expandMultipleResultFPLibCall(
if (VD && VD->isMasked()) {
EVT MaskVT = TLI->getSetCCResultType(getDataLayout(), Ctx, VT);
SDValue Mask = getBoolConstant(true, DL, MaskVT, VT);
AddArgListEntry(Mask, MaskVT.getTypeForEVT(Ctx));
Args.emplace_back(Mask, MaskVT.getTypeForEVT(Ctx));
}

Type *RetType = CallRetResNo.has_value()
Expand Down Expand Up @@ -9019,18 +9013,11 @@ SelectionDAG::getMemcmp(SDValue Chain, const SDLoc &dl, SDValue Mem0,
if (!LibCallName)
return {};

// Emit a library call.
auto GetEntry = [](Type *Ty, SDValue &SDV) {
TargetLowering::ArgListEntry E;
E.Ty = Ty;
E.Node = SDV;
return E;
};

PointerType *PT = PointerType::getUnqual(*getContext());
TargetLowering::ArgListTy Args = {
GetEntry(PT, Mem0), GetEntry(PT, Mem1),
GetEntry(getDataLayout().getIntPtrType(*getContext()), Size)};
{Mem0, PT},
{Mem1, PT},
{Size, getDataLayout().getIntPtrType(*getContext())}};

TargetLowering::CallLoweringInfo CLI(*this);
bool IsTailCall = false;
Expand Down Expand Up @@ -9101,13 +9088,10 @@ SDValue SelectionDAG::getMemcpy(

// Emit a library call.
TargetLowering::ArgListTy Args;
TargetLowering::ArgListEntry Entry;
Entry.Ty = PointerType::getUnqual(*getContext());
Entry.Node = Dst; Args.push_back(Entry);
Entry.Node = Src; Args.push_back(Entry);

Entry.Ty = getDataLayout().getIntPtrType(*getContext());
Entry.Node = Size; Args.push_back(Entry);
Type *PtrTy = PointerType::getUnqual(*getContext());
Args.emplace_back(Dst, PtrTy);
Args.emplace_back(Src, PtrTy);
Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
// FIXME: pass in SDLoc
TargetLowering::CallLoweringInfo CLI(*this);
bool IsTailCall = false;
Expand Down Expand Up @@ -9145,17 +9129,10 @@ SDValue SelectionDAG::getAtomicMemcpy(SDValue Chain, const SDLoc &dl,
MachinePointerInfo SrcPtrInfo) {
// Emit a library call.
TargetLowering::ArgListTy Args;
TargetLowering::ArgListEntry Entry;
Entry.Ty = getDataLayout().getIntPtrType(*getContext());
Entry.Node = Dst;
Args.push_back(Entry);

Entry.Node = Src;
Args.push_back(Entry);

Entry.Ty = SizeTy;
Entry.Node = Size;
Args.push_back(Entry);
Type *ArgTy = getDataLayout().getIntPtrType(*getContext());
Args.emplace_back(Dst, ArgTy);
Args.emplace_back(Src, ArgTy);
Args.emplace_back(Size, SizeTy);

RTLIB::Libcall LibraryCall =
RTLIB::getMEMCPY_ELEMENT_UNORDERED_ATOMIC(ElemSz);
Expand Down Expand Up @@ -9218,13 +9195,10 @@ SDValue SelectionDAG::getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,

// Emit a library call.
TargetLowering::ArgListTy Args;
TargetLowering::ArgListEntry Entry;
Entry.Ty = PointerType::getUnqual(*getContext());
Entry.Node = Dst; Args.push_back(Entry);
Entry.Node = Src; Args.push_back(Entry);

Entry.Ty = getDataLayout().getIntPtrType(*getContext());
Entry.Node = Size; Args.push_back(Entry);
Type *PtrTy = PointerType::getUnqual(*getContext());
Args.emplace_back(Dst, PtrTy);
Args.emplace_back(Src, PtrTy);
Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
// FIXME: pass in SDLoc
TargetLowering::CallLoweringInfo CLI(*this);

Expand Down Expand Up @@ -9262,17 +9236,10 @@ SDValue SelectionDAG::getAtomicMemmove(SDValue Chain, const SDLoc &dl,
MachinePointerInfo SrcPtrInfo) {
// Emit a library call.
TargetLowering::ArgListTy Args;
TargetLowering::ArgListEntry Entry;
Entry.Ty = getDataLayout().getIntPtrType(*getContext());
Entry.Node = Dst;
Args.push_back(Entry);

Entry.Node = Src;
Args.push_back(Entry);

Entry.Ty = SizeTy;
Entry.Node = Size;
Args.push_back(Entry);
Type *IntPtrTy = getDataLayout().getIntPtrType(*getContext());
Args.emplace_back(Dst, IntPtrTy);
Args.emplace_back(Src, IntPtrTy);
Args.emplace_back(Size, SizeTy);

RTLIB::Libcall LibraryCall =
RTLIB::getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(ElemSz);
Expand Down Expand Up @@ -9349,28 +9316,20 @@ SDValue SelectionDAG::getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,

const char *BzeroName = getTargetLoweringInfo().getLibcallName(RTLIB::BZERO);

// Helper function to create an Entry from Node and Type.
const auto CreateEntry = [](SDValue Node, Type *Ty) {
TargetLowering::ArgListEntry Entry;
Entry.Node = Node;
Entry.Ty = Ty;
return Entry;
};

bool UseBZero = isNullConstant(Src) && BzeroName;
// If zeroing out and bzero is present, use it.
if (UseBZero) {
TargetLowering::ArgListTy Args;
Args.push_back(CreateEntry(Dst, PointerType::getUnqual(Ctx)));
Args.push_back(CreateEntry(Size, DL.getIntPtrType(Ctx)));
Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
Args.emplace_back(Size, DL.getIntPtrType(Ctx));
CLI.setLibCallee(
TLI->getLibcallCallingConv(RTLIB::BZERO), Type::getVoidTy(Ctx),
getExternalSymbol(BzeroName, TLI->getPointerTy(DL)), std::move(Args));
} else {
TargetLowering::ArgListTy Args;
Args.push_back(CreateEntry(Dst, PointerType::getUnqual(Ctx)));
Args.push_back(CreateEntry(Src, Src.getValueType().getTypeForEVT(Ctx)));
Args.push_back(CreateEntry(Size, DL.getIntPtrType(Ctx)));
Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
Args.emplace_back(Size, DL.getIntPtrType(Ctx));
CLI.setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET),
Dst.getValueType().getTypeForEVT(Ctx),
getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET),
Expand Down Expand Up @@ -9399,18 +9358,9 @@ SDValue SelectionDAG::getAtomicMemset(SDValue Chain, const SDLoc &dl,
MachinePointerInfo DstPtrInfo) {
// Emit a library call.
TargetLowering::ArgListTy Args;
TargetLowering::ArgListEntry Entry;
Entry.Ty = getDataLayout().getIntPtrType(*getContext());
Entry.Node = Dst;
Args.push_back(Entry);

Entry.Ty = Type::getInt8Ty(*getContext());
Entry.Node = Value;
Args.push_back(Entry);

Entry.Ty = SizeTy;
Entry.Node = Size;
Args.push_back(Entry);
Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
Args.emplace_back(Size, SizeTy);

RTLIB::Libcall LibraryCall =
RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(ElemSz);
Expand Down Expand Up @@ -14065,10 +14015,7 @@ SDValue SelectionDAG::makeStateFunctionCall(unsigned LibFunc, SDValue Ptr,
const SDLoc &DLoc) {
assert(InChain.getValueType() == MVT::Other && "Expected token chain");
TargetLowering::ArgListTy Args;
TargetLowering::ArgListEntry Entry;
Entry.Node = Ptr;
Entry.Ty = Ptr.getValueType().getTypeForEVT(*getContext());
Args.push_back(Entry);
Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
RTLIB::Libcall LC = static_cast<RTLIB::Libcall>(LibFunc);
SDValue Callee = getExternalSymbol(TLI->getLibcallName(LC),
TLI->getPointerTy(getDataLayout()));
Expand Down
Loading