[llvm] bf36e90 - [GlobalISel][CallLowering] NFC: Unify flag-setting from CallBase + AttributeList
Jessica Paquette via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 18 11:09:19 PDT 2020
Author: Jessica Paquette
Date: 2020-08-18T11:07:33-07:00
New Revision: bf36e902953a4bf8ac0aae5a498445951fbc3882
URL: https://github.com/llvm/llvm-project/commit/bf36e902953a4bf8ac0aae5a498445951fbc3882
DIFF: https://github.com/llvm/llvm-project/commit/bf36e902953a4bf8ac0aae5a498445951fbc3882.diff
LOG: [GlobalISel][CallLowering] NFC: Unify flag-setting from CallBase + AttributeList
It's annoying to have to maintain multiple, nearly identical chains of if
statements which all set the same attributes.
Add a helper function, `addFlagsUsingAttrFn` which performs the attribute
setting.
Then, use wrappers for that function in `lowerCall` and `setArgFlags`.
(Note that the flag-setting code in `setArgFlags` was missing the returned
attribute. There's no selection for this yet, so no test. It's an example of
the kind of thing this lets us avoid, though.)
Differential Revision: https://reviews.llvm.org/D86159
Added:
Modified:
llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
index 1eec08f51062..ef93042f6690 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
@@ -213,6 +213,12 @@ class CallLowering {
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 <typename FuncInfoTy>
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
index cf1059c67b4a..49d101a81e93 100644
--- a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
@@ -30,34 +30,51 @@ using namespace llvm;
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<bool(Attribute::AttrKind)> &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<Register> ResRegs,
ArrayRef<ArrayRef<Register>> ArgRegs,
@@ -118,24 +135,7 @@ void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx,
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<PointerType>(Arg.Ty)->getElementType();
@@ -152,8 +152,6 @@ void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx,
FrameAlign = Align(getTLI()->getByValTypeAlignment(ElementTy, DL));
Flags.setByValAlign(FrameAlign);
}
- if (Attrs.hasAttribute(OpIdx, Attribute::Nest))
- Flags.setNest();
Flags.setOrigAlign(DL.getABITypeAlign(Arg.Ty));
}
More information about the llvm-commits
mailing list