[clang-tools-extra] r225629 - Make LoopConvert work with containers that are used like arrays.

David Blaikie dblaikie at gmail.com
Mon Jan 12 09:41:14 PST 2015


On Mon, Jan 12, 2015 at 5:17 AM, Daniel Jasper <djasper at google.com> wrote:

> Author: djasper
> Date: Mon Jan 12 07:17:56 2015
> New Revision: 225629
>
> URL: http://llvm.org/viewvc/llvm-project?rev=225629&view=rev
> Log:
> Make LoopConvert work with containers that are used like arrays.
>

Are these transformations classified as 'risky' in some way? These sort of
loops appear in a few places in LLVM deliberately because we're adding
elements to the sequence as we're iterating - so we check size each time
through and we access the vector with [] because its buffer might've been
invalidated by new insertions. (even with size() accessed once and cached,
we sometimes do this to visit pre-existing elements and ignore newly added
elements - which would still be broken by a transformation to
range-based-for/iterators)


>
> Modified:
>     clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopActions.cpp
>
> clang-tools-extra/trunk/test/clang-modernize/LoopConvert/naming-alias.cpp
>
> Modified:
> clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopActions.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopActions.cpp?rev=225629&r1=225628&r2=225629&view=diff
>
> ==============================================================================
> --- clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopActions.cpp
> (original)
> +++ clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopActions.cpp
> Mon Jan 12 07:17:56 2015
> @@ -450,9 +450,16 @@ static bool isAliasDecl(const Decl *TheD
>        const CXXOperatorCallExpr *OpCall = cast<CXXOperatorCallExpr>(Init);
>        if (OpCall->getOperator() == OO_Star)
>          return isDereferenceOfOpCall(OpCall, IndexVar);
> +      if (OpCall->getOperator() == OO_Subscript) {
> +        assert(OpCall->getNumArgs() == 2);
> +        return true;
> +      }
>        break;
>    }
>
> +  case Stmt::CXXMemberCallExprClass:
> +    return true;
> +
>    default:
>      break;
>    }
>
> Modified:
> clang-tools-extra/trunk/test/clang-modernize/LoopConvert/naming-alias.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-modernize/LoopConvert/naming-alias.cpp?rev=225629&r1=225628&r2=225629&view=diff
>
> ==============================================================================
> ---
> clang-tools-extra/trunk/test/clang-modernize/LoopConvert/naming-alias.cpp
> (original)
> +++
> clang-tools-extra/trunk/test/clang-modernize/LoopConvert/naming-alias.cpp
> Mon Jan 12 07:17:56 2015
> @@ -7,6 +7,8 @@
>  const int N = 10;
>
>  Val Arr[N];
> +dependent<Val> v;
> +dependent<Val> *pv;
>  Val &func(Val &);
>  void sideEffect(int);
>
> @@ -50,6 +52,25 @@ void aliasing() {
>    // CHECK-NEXT: int y = t.x;
>    // CHECK-NEXT: int z = elem.x + t.x;
>
> +  // The same for pseudo-arrays like std::vector<T> (or here
> dependent<Val>)
> +  // which provide a subscript operator[].
> +  for (int i = 0; i < v.size(); ++i) {
> +    Val &t = v[i]; { }
> +    int y = t.x;
> +  }
> +  // CHECK: for (auto & t : v)
> +  // CHECK-NEXT: { }
> +  // CHECK-NEXT: int y = t.x;
> +
> +  // The same with a call to at()
> +  for (int i = 0; i < pv->size(); ++i) {
> +    Val &t = pv->at(i); { }
> +    int y = t.x;
> +  }
> +  // CHECK: for (auto & t : *pv)
> +  // CHECK-NEXT: { }
> +  // CHECK-NEXT: int y = t.x;
> +
>    for (int i = 0; i < N; ++i) {
>      Val &t = func(Arr[i]);
>      int y = t.x;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150112/de04fa58/attachment.html>


More information about the cfe-commits mailing list