From: Chris Lattner Date: Mon, 23 Nov 2009 16:44:43 +0000 (+0000) Subject: speed up BasicAA a bit by implementing a long-standing TODO. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b34b82e9d1ec6ddbdc23dfd9bb65cd9d22527cd2;p=oota-llvm.git speed up BasicAA a bit by implementing a long-standing TODO. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@89663 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index d366a50274a..af47f200783 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -289,18 +289,29 @@ BasicAliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) { return NoModRef; // If the pointer is to a locally allocated object that does not escape, - // then the call can not mod/ref the pointer unless the call takes the - // argument without capturing it. + // 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((*CI)->getType()) && - alias(cast(CI), ~0U, P, ~0U) != NoAlias) - passedAsArg = true; + CI != CE; ++CI, ++ArgNo) { + // Only look at the no-capture pointer arguments. + if (!isa((*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(CI), ~0U, P, ~0U) != NoAlias) { + PassedAsArg = true; + break; + } + } - if (!passedAsArg) + if (!PassedAsArg) return NoModRef; }