[llvm] r208286 - Revert "SCEV: Use I = vector<>.erase(I) to iterate and delete at the same time"

Benjamin Kramer benny.kra at gmail.com
Thu May 8 13:16:17 PDT 2014


On 08.05.2014, at 09:55, Tobias Grosser <tobias at grosser.es> wrote:

> Author: grosser
> Date: Thu May  8 02:55:34 2014
> New Revision: 208286
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=208286&view=rev
> Log:
> Revert "SCEV: Use I = vector<>.erase(I) to iterate and delete at the same time"
> 
> as committed in r208282. The original commit was incorrect.

This looks like a perfect candidate for std::remove_if. It also avoids the O(n^2) behavior you get by calling erase on a vector in a loop.

- Ben
> 
> Modified:
>    llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> 
> Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=208286&r1=208285&r2=208286&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Thu May  8 02:55:34 2014
> @@ -7223,9 +7223,12 @@ static void findArrayDimensionsRec(Scala
>     Terms[I] = Q;
>   }
> 
> -  for (auto I = Terms.begin(), E = Terms.end(); I != E; I++)
> -    if (isa<SCEVConstant>(*I))
> -      I = Terms.erase(I);
> +  // Remove all SCEVConstants.
> +  for (unsigned I = 0; I < Terms.size();)
> +    if (isa<SCEVConstant>(Terms[I]))
> +      Terms.erase(Terms.begin() + I);
> +    else
> +      ++I;
> 
>   if (Terms.size() > 0)
>     findArrayDimensionsRec(SE, Terms, Sizes, Zero, One);
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list