[llvm-commits] [llvm] r89663 - /llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp

Duncan Sands baldrick at free.fr
Mon Nov 23 13:02:22 PST 2009


Hi Chris, I tried to understand what you are doing here but failed,
feel like explaining some more?  I don't see how capture/nocapture
is relevant here...

Ciao,

Duncan.

> +  // then the call can not mod/ref the pointer unless the call takes the pointer
> +  // as an argument, and itself doesn't capture it.
>    if (isNonEscapingLocalObject(Object) && CS.getInstruction() != Object) {
> -    bool passedAsArg = false;
> -    // TODO: Eventually only check 'nocapture' arguments.
> +    bool PassedAsArg = false;
> +    unsigned ArgNo = 0;
>      for (CallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end();
> -         CI != CE; ++CI)
> -      if (isa<PointerType>((*CI)->getType()) &&
> -          alias(cast<Value>(CI), ~0U, P, ~0U) != NoAlias)
> -        passedAsArg = true;
> +         CI != CE; ++CI, ++ArgNo) {
> +      // Only look at the no-capture pointer arguments.
> +      if (!isa<PointerType>((*CI)->getType()) ||
> +          !CS.paramHasAttr(ArgNo+1, Attribute::NoCapture))
> +        continue;
> +      
> +      // If  this is a no-capture pointer argument, see if we can tell that it
> +      // is impossible to alias the pointer we're checking.  If not, we have to
> +      // assume that the call could touch the pointer, even though it doesn't
> +      // escape.
> +      if (alias(cast<Value>(CI), ~0U, P, ~0U) != NoAlias) {
> +        PassedAsArg = true;
> +        break;
> +      }
> +    }
>      
> -    if (!passedAsArg)
> +    if (!PassedAsArg)
>        return NoModRef;



More information about the llvm-commits mailing list