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