summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/IR/InstrTypes.h13
-rw-r--r--llvm/lib/Transforms/IPO/Attributor.cpp4
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));
OpenPOWER on IntegriCloud