From 40d7f354b5637066a7ad3d50e19df482ee234d53 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Sat, 22 Jun 2013 16:56:32 +0000 Subject: [PATCH] Revert "FunctionAttrs: Merge attributes once instead of doing it for every argument." It doesn't work as I intended it to. This reverts commit r184638. llvm-svn: 184641 --- llvm/lib/Transforms/IPO/FunctionAttrs.cpp | 78 ++++++++++------------- 1 file changed, 32 insertions(+), 46 deletions(-) diff --git a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp index 9e55e61c51c1..bc5109b4d48d 100644 --- a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp +++ b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp @@ -410,6 +410,9 @@ bool FunctionAttrs::AddNoCaptureAttrs(const CallGraphSCC &SCC) { ArgumentGraph AG; + AttrBuilder B; + B.addAttribute(Attribute::NoCapture); + // Check each function in turn, determining which pointer arguments are not // captured. for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { @@ -424,59 +427,43 @@ bool FunctionAttrs::AddNoCaptureAttrs(const CallGraphSCC &SCC) { if (F->isDeclaration() || F->mayBeOverridden()) continue; - SmallVector AttrSets; - // Functions that are readonly (or readnone) and nounwind and don't return // a value can't capture arguments. Don't analyze them. if (F->onlyReadsMemory() && F->doesNotThrow() && F->getReturnType()->isVoidTy()) { - for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E; - ++A) { - if (!A->getType()->isPointerTy() || A->hasNoCaptureAttr()) - continue; - - AttributeSet In = - F->getAttributes().getParamAttributes(A->getArgNo() + 1); - AttrSets.push_back(In.addAttribute(F->getContext(), A->getArgNo() + 1, - Attribute::NoCapture)); + for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); + A != E; ++A) { + if (A->getType()->isPointerTy() && !A->hasNoCaptureAttr()) { + A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo() + 1, B)); + ++NumNoCapture; + Changed = true; + } } - } else { - for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E; - ++A) { - if (!A->getType()->isPointerTy() || A->hasNoCaptureAttr()) - continue; + continue; + } + for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A!=E; ++A) + if (A->getType()->isPointerTy() && !A->hasNoCaptureAttr()) { ArgumentUsesTracker Tracker(SCCNodes); PointerMayBeCaptured(A, &Tracker); - if (Tracker.Captured) - continue; // It's captured. Don't bother doing SCC analysis on it. - - if (Tracker.Uses.empty()) { - // If it's trivially not captured, mark it nocapture now. - AttributeSet In = - F->getAttributes().getParamAttributes(A->getArgNo() + 1); - AttrSets.push_back(In.addAttribute(F->getContext(), A->getArgNo() + 1, - Attribute::NoCapture)); - } else { - // If it's not trivially captured and not trivially not captured, - // then it must be calling into another function in our SCC. Save - // its particulars for Argument-SCC analysis later. - ArgumentGraphNode *Node = AG[A]; - for (SmallVectorImpl::iterator UI = Tracker.Uses.begin(), - UE = Tracker.Uses.end(); - UI != UE; ++UI) - Node->Uses.push_back(AG[*UI]); + if (!Tracker.Captured) { + if (Tracker.Uses.empty()) { + // If it's trivially not captured, mark it nocapture now. + A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo()+1, B)); + ++NumNoCapture; + Changed = true; + } else { + // If it's not trivially captured and not trivially not captured, + // then it must be calling into another function in our SCC. Save + // its particulars for Argument-SCC analysis later. + ArgumentGraphNode *Node = AG[A]; + for (SmallVectorImpl::iterator UI = Tracker.Uses.begin(), + UE = Tracker.Uses.end(); UI != UE; ++UI) + Node->Uses.push_back(AG[*UI]); + } } + // Otherwise, it's captured. Don't bother doing SCC analysis on it. } - } - - // Merge all attribute sets into one in a single step. - if (!AttrSets.empty()) { - NumNoCapture += AttrSets.size(); - AttrSets.push_back(F->getAttributes()); - F->setAttributes(AttributeSet::get(F->getContext(), AttrSets)); - Changed = true; - } } // The graph we've collected is partial because we stopped scanning for @@ -499,7 +486,7 @@ bool FunctionAttrs::AddNoCaptureAttrs(const CallGraphSCC &SCC) { Definition-> addAttr(AttributeSet::get(ArgumentSCC[0]->Definition->getContext(), ArgumentSCC[0]->Definition->getArgNo() + 1, - Attribute::NoCapture)); + B)); ++NumNoCapture; Changed = true; } @@ -541,8 +528,7 @@ bool FunctionAttrs::AddNoCaptureAttrs(const CallGraphSCC &SCC) { for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) { Argument *A = ArgumentSCC[i]->Definition; - A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, - Attribute::NoCapture)); + A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); ++NumNoCapture; Changed = true; } -- 2.34.1