[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