/// it in its containing function.
bool hasNoAliasAttr() const;
+ /// hasNoCaptureAttr - Return true if this argument has the nocapture
+ /// attribute on it in its containing function.
+ bool hasNoCaptureAttr() const;
+
/// hasSRetAttr - Return true if this argument has the sret attribute on it in
/// its containing function.
bool hasStructRetAttr() const;
continue;
for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A!=E; ++A)
- if (isa<PointerType>(A->getType()) && !isCaptured(*F, A)) {
+ if (isa<PointerType>(A->getType()) && !A->hasNoCaptureAttr() &&
+ !isCaptured(*F, A)) {
A->addAttr(Attribute::NoCapture);
NumNoCapture++;
Changed = true;
return getParent()->paramHasAttr(getArgNo()+1, Attribute::NoAlias);
}
+/// hasNoCaptureAttr - Return true if this argument has the nocapture attribute
+/// on it in its containing function.
+bool Argument::hasNoCaptureAttr() const {
+ if (!isa<PointerType>(getType())) return false;
+ return getParent()->paramHasAttr(getArgNo()+1, Attribute::NoCapture);
+}
+
/// hasSRetAttr - Return true if this argument has the sret attribute on
/// it in its containing function.
bool Argument::hasStructRetAttr() const {