diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h --- a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h @@ -213,6 +213,12 @@ ISD::ArgFlagsTy getAttributesForArgIdx(const CallBase &Call, unsigned ArgIdx) const; + /// Adds flags to \p Flags based off of the attributes in \p Attrs. + /// \p OpIdx is the index in \p Attrs to add flags from. + void addArgFlagsFromAttributes(ISD::ArgFlagsTy &Flags, + const AttributeList &Attrs, + unsigned OpIdx) const; + template void setArgFlags(ArgInfo &Arg, unsigned OpIdx, const DataLayout &DL, const FuncInfoTy &FuncInfo) const; diff --git a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp --- a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp @@ -30,34 +30,51 @@ void CallLowering::anchor() {} -ISD::ArgFlagsTy CallLowering::getAttributesForArgIdx(const CallBase &Call, - unsigned ArgIdx) const { - ISD::ArgFlagsTy Flags; - if (Call.paramHasAttr(ArgIdx, Attribute::SExt)) +/// Helper function which updates \p Flags when \p AttrFn returns true. +static void +addFlagsUsingAttrFn(ISD::ArgFlagsTy &Flags, + const std::function &AttrFn) { + if (AttrFn(Attribute::SExt)) Flags.setSExt(); - if (Call.paramHasAttr(ArgIdx, Attribute::ZExt)) + if (AttrFn(Attribute::ZExt)) Flags.setZExt(); - if (Call.paramHasAttr(ArgIdx, Attribute::InReg)) + if (AttrFn(Attribute::InReg)) Flags.setInReg(); - if (Call.paramHasAttr(ArgIdx, Attribute::StructRet)) + if (AttrFn(Attribute::StructRet)) Flags.setSRet(); - if (Call.paramHasAttr(ArgIdx, Attribute::Nest)) + if (AttrFn(Attribute::Nest)) Flags.setNest(); - if (Call.paramHasAttr(ArgIdx, Attribute::ByVal)) + if (AttrFn(Attribute::ByVal)) Flags.setByVal(); - if (Call.paramHasAttr(ArgIdx, Attribute::Preallocated)) + if (AttrFn(Attribute::Preallocated)) Flags.setPreallocated(); - if (Call.paramHasAttr(ArgIdx, Attribute::InAlloca)) + if (AttrFn(Attribute::InAlloca)) Flags.setInAlloca(); - if (Call.paramHasAttr(ArgIdx, Attribute::Returned)) + if (AttrFn(Attribute::Returned)) Flags.setReturned(); - if (Call.paramHasAttr(ArgIdx, Attribute::SwiftSelf)) + if (AttrFn(Attribute::SwiftSelf)) Flags.setSwiftSelf(); - if (Call.paramHasAttr(ArgIdx, Attribute::SwiftError)) + if (AttrFn(Attribute::SwiftError)) Flags.setSwiftError(); +} + +ISD::ArgFlagsTy CallLowering::getAttributesForArgIdx(const CallBase &Call, + unsigned ArgIdx) const { + ISD::ArgFlagsTy Flags; + addFlagsUsingAttrFn(Flags, [&Call, &ArgIdx](Attribute::AttrKind Attr) { + return Call.paramHasAttr(ArgIdx, Attr); + }); return Flags; } +void CallLowering::addArgFlagsFromAttributes(ISD::ArgFlagsTy &Flags, + const AttributeList &Attrs, + unsigned OpIdx) const { + addFlagsUsingAttrFn(Flags, [&Attrs, &OpIdx](Attribute::AttrKind Attr) { + return Attrs.hasAttribute(OpIdx, Attr); + }); +} + bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &CB, ArrayRef ResRegs, ArrayRef> ArgRegs, @@ -118,24 +135,7 @@ const FuncInfoTy &FuncInfo) const { auto &Flags = Arg.Flags[0]; const AttributeList &Attrs = FuncInfo.getAttributes(); - if (Attrs.hasAttribute(OpIdx, Attribute::ZExt)) - Flags.setZExt(); - if (Attrs.hasAttribute(OpIdx, Attribute::SExt)) - Flags.setSExt(); - if (Attrs.hasAttribute(OpIdx, Attribute::InReg)) - Flags.setInReg(); - if (Attrs.hasAttribute(OpIdx, Attribute::StructRet)) - Flags.setSRet(); - if (Attrs.hasAttribute(OpIdx, Attribute::SwiftSelf)) - Flags.setSwiftSelf(); - if (Attrs.hasAttribute(OpIdx, Attribute::SwiftError)) - Flags.setSwiftError(); - if (Attrs.hasAttribute(OpIdx, Attribute::ByVal)) - Flags.setByVal(); - if (Attrs.hasAttribute(OpIdx, Attribute::Preallocated)) - Flags.setPreallocated(); - if (Attrs.hasAttribute(OpIdx, Attribute::InAlloca)) - Flags.setInAlloca(); + addArgFlagsFromAttributes(Flags, Attrs, OpIdx); if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated()) { Type *ElementTy = cast(Arg.Ty)->getElementType(); @@ -152,8 +152,6 @@ FrameAlign = Align(getTLI()->getByValTypeAlignment(ElementTy, DL)); Flags.setByValAlign(FrameAlign); } - if (Attrs.hasAttribute(OpIdx, Attribute::Nest)) - Flags.setNest(); Flags.setOrigAlign(DL.getABITypeAlign(Arg.Ty)); }