diff options
-rw-r--r-- | llvm/include/llvm/IR/InstrTypes.h | 13 | ||||
-rw-r--r-- | llvm/lib/Transforms/IPO/Attributor.cpp | 4 |
2 files changed, 15 insertions, 2 deletions
diff --git a/llvm/include/llvm/IR/InstrTypes.h b/llvm/include/llvm/IR/InstrTypes.h index faf58cf1901..a85e0f29346 100644 --- a/llvm/include/llvm/IR/InstrTypes.h +++ b/llvm/include/llvm/IR/InstrTypes.h @@ -1272,6 +1272,19 @@ public: 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 index b7471a32faf..b959dc0e607 100644 --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -1572,7 +1572,7 @@ struct AANoFreeFloating : AANoFreeImpl { if (!CB->isArgOperand(U)) continue; - unsigned ArgNo = U - CB->arg_begin(); + unsigned ArgNo = CB->getArgOperandNo(U); const auto &NoFreeArg = A.getAAFor<AANoFree>( *this, IRPosition::callsite_argument(*CB, ArgNo)); @@ -4144,7 +4144,7 @@ ChangeStatus AAHeapToStackImpl::updateImpl(Attributor &A) { const auto &NoFreeAA = A.getAAFor<AANoFree>(*this, IRPosition::callsite_function(*CB)); - unsigned ArgNo = U - CB->arg_begin(); + unsigned ArgNo = CB->getArgOperandNo(U); const auto &NoCaptureAA = A.getAAFor<AANoCapture>( *this, IRPosition::callsite_argument(*CB, ArgNo)); |