[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