Index: lib/Transforms/IPO/FunctionAttrs.cpp =================================================================== --- lib/Transforms/IPO/FunctionAttrs.cpp +++ lib/Transforms/IPO/FunctionAttrs.cpp @@ -321,23 +321,19 @@ return true; } - bool Found = false; - Function::arg_iterator AI = F->arg_begin(), AE = F->arg_end(); - for (CallSite::arg_iterator PI = CS.arg_begin(), PE = CS.arg_end(); - PI != PE; ++PI, ++AI) { - if (AI == AE) { - assert(F->isVarArg() && "More params than args in non-varargs call"); - Captured = true; - return true; - } - if (PI == U) { - Uses.push_back(&*AI); - Found = true; - break; - } + unsigned UseIndex = + std::distance(const_cast(CS->op_begin()), U); + + assert(UseIndex < CS.arg_size() && "Non-argument use?"); + if (UseIndex >= F->arg_size()) { + assert(F->isVarArg() && "More params than args in non-varargs call"); + Captured = true; + return true; } - assert(Found && "Capturing call-site captured nothing?"); - (void)Found; + + auto FormalArgIt = F->arg_begin(); + std::advance(FormalArgIt, UseIndex); + Uses.push_back(FormalArgIt); return false; }