diff --git a/llvm/include/llvm/IR/InstrTypes.h b/llvm/include/llvm/IR/InstrTypes.h --- a/llvm/include/llvm/IR/InstrTypes.h +++ b/llvm/include/llvm/IR/InstrTypes.h @@ -1272,6 +1272,19 @@ return isArgOperand(&UI.getUse()); } + /// Given a use for a arg operand, get the arg operand number that + /// corresponds to it. + unsigned getArgOperandNo(const Use *U) const { + assert(isArgOperand(U) && "Arg operand # out of range!"); + return U - arg_begin(); + } + + /// Given a value use iterator, return the arg operand number corresponding to + /// it. Iterator must actually correspond to a data operand. + unsigned getArgOperandNo(Value::const_user_iterator UI) const { + return getArgOperandNo(&UI.getUse()); + } + /// Returns true if this CallSite passes the given Value* as an argument to /// the called function. bool hasArgument(const Value *V) const { diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -1572,7 +1572,7 @@ if (!CB->isArgOperand(U)) continue; - unsigned ArgNo = U - CB->arg_begin(); + unsigned ArgNo = CB->getArgOperandNo(U); const auto &NoFreeArg = A.getAAFor( *this, IRPosition::callsite_argument(*CB, ArgNo)); @@ -4144,7 +4144,7 @@ const auto &NoFreeAA = A.getAAFor(*this, IRPosition::callsite_function(*CB)); - unsigned ArgNo = U - CB->arg_begin(); + unsigned ArgNo = CB->getArgOperandNo(U); const auto &NoCaptureAA = A.getAAFor( *this, IRPosition::callsite_argument(*CB, ArgNo));