diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2013-06-22 16:56:32 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2013-06-22 16:56:32 +0000 |
commit | 5729b8ea01739cf9b1171f0a4349275bc8124756 (patch) | |
tree | a2546c25b6f029171f79b16e7a501ffb6577d75f | |
parent | 39bab0e11abc1a310c537052872415b29b6a4241 (diff) | |
download | external_llvm-5729b8ea01739cf9b1171f0a4349275bc8124756.zip external_llvm-5729b8ea01739cf9b1171f0a4349275bc8124756.tar.gz external_llvm-5729b8ea01739cf9b1171f0a4349275bc8124756.tar.bz2 |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184641 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/IPO/FunctionAttrs.cpp | 78 |
1 files changed, 32 insertions, 46 deletions
diff --git a/lib/Transforms/IPO/FunctionAttrs.cpp b/lib/Transforms/IPO/FunctionAttrs.cpp index 9e55e61..bc5109b 100644 --- a/lib/Transforms/IPO/FunctionAttrs.cpp +++ b/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<AttributeSet, 8> 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<Argument *>::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<Argument*>::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; } |