r264008 - [sema] [CUDA] Use std algorithms in EraseUnwantedCUDAMatchesImpl.
Benjamin Kramer via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 30 05:08:09 PDT 2016
On Tue, Mar 22, 2016 at 1:09 AM, Justin Lebar via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: jlebar
> Date: Mon Mar 21 19:09:25 2016
> New Revision: 264008
>
> URL: http://llvm.org/viewvc/llvm-project?rev=264008&view=rev
> Log:
> [sema] [CUDA] Use std algorithms in EraseUnwantedCUDAMatchesImpl.
>
> Summary: NFC
>
> Reviewers: tra
>
> Subscribers: cfe-commits
>
> Differential Revision: http://reviews.llvm.org/D18327
>
> Modified:
> cfe/trunk/lib/Sema/SemaCUDA.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaCUDA.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCUDA.cpp?rev=264008&r1=264007&r2=264008&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaCUDA.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaCUDA.cpp Mon Mar 21 19:09:25 2016
> @@ -210,31 +210,28 @@ bool Sema::CheckCUDATarget(const Functio
> return false;
> }
>
> -template <typename T, typename FetchDeclFn>
> -static void EraseUnwantedCUDAMatchesImpl(Sema &S, const FunctionDecl *Caller,
> - llvm::SmallVectorImpl<T> &Matches,
> - FetchDeclFn FetchDecl) {
> +template <typename T>
> +static void EraseUnwantedCUDAMatchesImpl(
> + Sema &S, const FunctionDecl *Caller, llvm::SmallVectorImpl<T> &Matches,
> + std::function<const FunctionDecl *(const T &)> FetchDecl) {
> assert(S.getLangOpts().CUDATargetOverloads &&
> "Should not be called w/o enabled target overloads.");
> if (Matches.size() <= 1)
> return;
>
> + // Gets the CUDA function preference for a call from Caller to Match.
> + auto GetCFP = [&](const T &Match) {
> + return S.IdentifyCUDAPreference(Caller, FetchDecl(Match));
> + };
> +
> // Find the best call preference among the functions in Matches.
> - Sema::CUDAFunctionPreference P, BestCFP = Sema::CFP_Never;
> - for (auto const &Match : Matches) {
> - P = S.IdentifyCUDAPreference(Caller, FetchDecl(Match));
> - if (P > BestCFP)
> - BestCFP = P;
> - }
> + Sema::CUDAFunctionPreference BestCFP = GetCFP(*std::max_element(
> + Matches.begin(), Matches.end(),
> + [&](const T &M1, const T &M2) { return GetCFP(M1) < GetCFP(M2); }));
>
> // Erase all functions with lower priority.
> - for (unsigned I = 0, N = Matches.size(); I != N;)
> - if (S.IdentifyCUDAPreference(Caller, FetchDecl(Matches[I])) < BestCFP) {
> - Matches[I] = Matches[--N];
> - Matches.resize(N);
> - } else {
> - ++I;
> - }
> + Matches.erase(llvm::remove_if(
> + Matches, [&](const T &Match) { return GetCFP(Match) < BestCFP; }));
This is the single-element form of SmallVector::erase, so it won't
remove ALL functions with lower priority. I sense a lack of test case
here.
> }
>
> void Sema::EraseUnwantedCUDAMatches(const FunctionDecl *Caller,
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list