<div dir="ltr">Now that Arguments are contiguous in the Function - could you remove the ArgNo member and compute it in O(1) by offset from the beginning of the Arguments on the Function?<br><br><div class="gmail_quote"><div dir="ltr">On Thu, Mar 16, 2017 at 2:56 PM Reid Kleckner via Phabricator via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">rnk created this revision.<br class="gmail_msg">
Herald added a subscriber: mehdi_amini.<br class="gmail_msg">
<br class="gmail_msg">
getArgNo is actually hot in LLVM, because its how we check for<br class="gmail_msg">
attributes on arguments:<br class="gmail_msg">
<br class="gmail_msg">
  bool Argument::hasNonNullAttr() const {<br class="gmail_msg">
    if (!getType()->isPointerTy()) return false;<br class="gmail_msg">
    if (getParent()->getAttributes().<br class="gmail_msg">
          hasAttribute(getArgNo()+1, Attribute::NonNull))<br class="gmail_msg">
      return true;<br class="gmail_msg">
<br class="gmail_msg">
It actually shows up as the 23rd hottest leaf function in a 13s sample<br class="gmail_msg">
of LTO of llc.<br class="gmail_msg">
<br class="gmail_msg">
This grows Argument by four bytes, but I have another pending patch to<br class="gmail_msg">
shrink it by removing its ilist_node base.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
<a href="https://reviews.llvm.org/D31057" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D31057</a><br class="gmail_msg">
<br class="gmail_msg">
Files:<br class="gmail_msg">
  include/llvm/IR/Argument.h<br class="gmail_msg">
  lib/IR/Function.cpp<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Index: lib/IR/Function.cpp<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- lib/IR/Function.cpp<br class="gmail_msg">
+++ lib/IR/Function.cpp<br class="gmail_msg">
@@ -39,27 +39,15 @@<br class="gmail_msg">
<br class="gmail_msg">
 void Argument::anchor() { }<br class="gmail_msg">
<br class="gmail_msg">
-Argument::Argument(Type *Ty, const Twine &Name)<br class="gmail_msg">
-    : Value(Ty, Value::ArgumentVal), Parent(nullptr) {<br class="gmail_msg">
+Argument::Argument(Type *Ty, const Twine &Name, unsigned ArgNo)<br class="gmail_msg">
+    : Value(Ty, Value::ArgumentVal), Parent(nullptr), ArgNo(ArgNo) {<br class="gmail_msg">
   setName(Name);<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 void Argument::setParent(Function *parent) {<br class="gmail_msg">
   Parent = parent;<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
-unsigned Argument::getArgNo() const {<br class="gmail_msg">
-  const Function *F = getParent();<br class="gmail_msg">
-  assert(F && "Argument is not in a function");<br class="gmail_msg">
-<br class="gmail_msg">
-  Function::const_arg_iterator AI = F->arg_begin();<br class="gmail_msg">
-  unsigned ArgIdx = 0;<br class="gmail_msg">
-  for (; &*AI != this; ++AI)<br class="gmail_msg">
-    ++ArgIdx;<br class="gmail_msg">
-<br class="gmail_msg">
-  return ArgIdx;<br class="gmail_msg">
-}<br class="gmail_msg">
-<br class="gmail_msg">
 bool Argument::hasNonNullAttr() const {<br class="gmail_msg">
   if (!getType()->isPointerTy()) return false;<br class="gmail_msg">
   if (getParent()->getAttributes().<br class="gmail_msg">
@@ -240,7 +228,8 @@<br class="gmail_msg">
   for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {<br class="gmail_msg">
     assert(!FT->getParamType(i)->isVoidTy() &&<br class="gmail_msg">
            "Cannot have void typed arguments!");<br class="gmail_msg">
-    ArgumentList.push_back(new Argument(FT->getParamType(i)));<br class="gmail_msg">
+    ArgumentList.push_back(<br class="gmail_msg">
+        new Argument(FT->getParamType(i), "", i));<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
   // Clear the lazy arguments bit.<br class="gmail_msg">
Index: include/llvm/IR/Argument.h<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- include/llvm/IR/Argument.h<br class="gmail_msg">
+++ include/llvm/IR/Argument.h<br class="gmail_msg">
@@ -32,21 +32,22 @@<br class="gmail_msg">
 class Argument : public Value, public ilist_node<Argument> {<br class="gmail_msg">
   virtual void anchor();<br class="gmail_msg">
   Function *Parent;<br class="gmail_msg">
+  unsigned ArgNo;<br class="gmail_msg">
<br class="gmail_msg">
   friend class SymbolTableListTraits<Argument>;<br class="gmail_msg">
   void setParent(Function *parent);<br class="gmail_msg">
<br class="gmail_msg">
 public:<br class="gmail_msg">
   /// Argument constructor.<br class="gmail_msg">
-  explicit Argument(Type *Ty, const Twine &Name = "");<br class="gmail_msg">
+  explicit Argument(Type *Ty, const Twine &Name = "", unsigned ArgNo = 0);<br class="gmail_msg">
<br class="gmail_msg">
   inline const Function *getParent() const { return Parent; }<br class="gmail_msg">
   inline       Function *getParent()       { return Parent; }<br class="gmail_msg">
<br class="gmail_msg">
   /// Return the index of this formal argument in its containing function.<br class="gmail_msg">
   ///<br class="gmail_msg">
   /// For example in "void foo(int a, float b)" a is 0 and b is 1.<br class="gmail_msg">
-  unsigned getArgNo() const;<br class="gmail_msg">
+  unsigned getArgNo() const { return ArgNo; }<br class="gmail_msg">
<br class="gmail_msg">
   /// Return true if this argument has the nonnull attribute. Also returns true<br class="gmail_msg">
   /// if at least one byte is known to be dereferenceable and the pointer is in<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
llvm-commits mailing list<br class="gmail_msg">
<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div></div>