<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 6, 2016 at 11:44 AM, Chandler Carruth via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><span class=""><div dir="ltr">On Tue, Jul 5, 2016 at 5:19 PM Davide Italiano via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">On Mon, Jun 27, 2016 at 4:26 PM, Chandler Carruth via llvm-commits<br>
<<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br>
> Author: chandlerc<br>
> Date: Mon Jun 27 18:26:08 2016<br>
> New Revision: 273961<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=273961&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=273961&view=rev</a><br>
> Log:<br>
> [PM] Improve the debugging and logging facilities of the CGSCC bits of<br>
> the new pass manager.<br>
><br>
> This adds operator<< overloads for the various bits of the<br>
> LazyCallGraph, dump methods for use from the debugger, and debug logging<br>
> using them to the CGSCC pass manager.<br>
><br>
> Having this was essential for debugging the call graph update patch, and<br>
> I've extracted what I could from that patch here to minimize the delta.<br>
><br>
> Modified:<br>
> llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h<br>
> llvm/trunk/include/llvm/Analysis/LazyCallGraph.h<br>
> llvm/trunk/lib/Analysis/LazyCallGraph.cpp<br>
> llvm/trunk/lib/Passes/PassBuilder.cppHi Hi<br>
> llvm/trunk/test/Other/new-pass-manager.ll<br>
><br>
<br>
Hi Chandler, this breaks the build with GCC6. Can you please take a look?<br></blockquote><div><br></div></span><div>Yikes, just back from the holiday weekend and looking at this. Is there a build bot with this configuration? I'm worried I may not get it on my first shot...</div></div></div></blockquote><div><br></div><div>In case it helps, <a href="http://gcc.godbolt.org/">http://gcc.godbolt.org/</a> has GCC6 available.</div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
Thanks!<br>
<br>
[756/2768] Building CXX object<br>
lib/Analysis/CMakeFiles/LLVMAnalysis.dir/LazyCallGraph.cpp.o<br>
../lib/Analysis/LazyCallGraph.cpp:123:14: warning: ‘llvm::raw_ostream&<br>
llvm::operator<<(llvm::raw_ostream&, const<br>
llvm::LazyCallGraph::Node&)’ has not been declared within llvm<br>
raw_ostream &llvm::operator<<(raw_ostream &OS, const LazyCallGraph::Node &N) {<br>
^~~~<br>
In file included from ../lib/Analysis/LazyCallGraph.cpp:10:0:<br>
../include/llvm/Analysis/LazyCallGraph.h:227:25: note: only here as a friend<br>
friend raw_ostream &operator<<(raw_ostream &OS, const Node &N);<br>
^~~~~~~~<br>
../lib/Analysis/LazyCallGraph.cpp:184:14: warning: ‘llvm::raw_ostream&<br>
llvm::operator<<(llvm::raw_ostream&, const llvm::LazyCallGraph::SCC&)’<br>
has not been declared within llvm<br>
raw_ostream &llvm::operator<<(raw_ostream &OS, const LazyCallGraph::SCC &C) {<br>
^~~~<br>
In file included from ../lib/Analysis/LazyCallGraph.cpp:10:0:<br>
../include/llvm/Analysis/LazyCallGraph.h:367:25: note: only here as a friend<br>
friend raw_ostream &operator<<(raw_ostream &OS, const SCC &C);<br>
^~~~~~~~<br>
../lib/Analysis/LazyCallGraph.cpp:227:14: warning: ‘llvm::raw_ostream&<br>
llvm::operator<<(llvm::raw_ostream&, const<br>
llvm::LazyCallGraph::RefSCC&)’ has not been declared within llvm<br>
raw_ostream &llvm::operator<<(raw_ostream &OS,<br>
^~~~<br>
In file included from ../lib/Analysis/LazyCallGraph.cpp:10:0:<br>
../include/llvm/Analysis/LazyCallGraph.h:439:25: note: only here as a friend<br>
friend raw_ostream &operator<<(raw_ostream &OS, const RefSCC &RC);<br>
^~~~~~~~<br>
<br>
<br>
<br>
> Modified: llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h?rev=273961&r1=273960&r2=273961&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h?rev=273961&r1=273960&r2=273961&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h (original)<br>
> +++ llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h Mon Jun 27 18:26:08 2016<br>
> @@ -67,19 +67,20 @@ template <typename CGSCCPassT><br>
> class ModuleToPostOrderCGSCCPassAdaptor<br>
> : public PassInfoMixin<ModuleToPostOrderCGSCCPassAdaptor<CGSCCPassT>> {<br>
> public:<br>
> - explicit ModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT Pass)<br>
> - : Pass(std::move(Pass)) {}<br>
> + explicit ModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT Pass, bool DebugLogging = false)<br>
> + : Pass(std::move(Pass)), DebugLogging(DebugLogging) {}<br>
> // We have to explicitly define all the special member functions because MSVC<br>
> // refuses to generate them.<br>
> ModuleToPostOrderCGSCCPassAdaptor(<br>
> const ModuleToPostOrderCGSCCPassAdaptor &Arg)<br>
> - : Pass(Arg.Pass) {}<br>
> + : Pass(Arg.Pass), DebugLogging(Arg.DebugLogging) {}<br>
> ModuleToPostOrderCGSCCPassAdaptor(ModuleToPostOrderCGSCCPassAdaptor &&Arg)<br>
> - : Pass(std::move(Arg.Pass)) {}<br>
> + : Pass(std::move(Arg.Pass)), DebugLogging(Arg.DebugLogging) {}<br>
> friend void swap(ModuleToPostOrderCGSCCPassAdaptor &LHS,<br>
> ModuleToPostOrderCGSCCPassAdaptor &RHS) {<br>
> using std::swap;<br>
> swap(LHS.Pass, RHS.Pass);<br>
> + swap(LHS.DebugLogging, RHS.DebugLogging);<br>
> }<br>
> ModuleToPostOrderCGSCCPassAdaptor &<br>
> operator=(ModuleToPostOrderCGSCCPassAdaptor RHS) {<br>
> @@ -97,8 +98,11 @@ public:<br>
> LazyCallGraph &CG = AM.getResult<LazyCallGraphAnalysis>(M);<br>
><br>
> PreservedAnalyses PA = PreservedAnalyses::all();<br>
> - for (LazyCallGraph::RefSCC &OuterC : CG.postorder_ref_sccs())<br>
> - for (LazyCallGraph::SCC &C : OuterC) {<br>
> + for (LazyCallGraph::RefSCC &RC : CG.postorder_ref_sccs()) {<br>
> + if (DebugLogging)<br>
> + dbgs() << "Running an SCC pass across the RefSCC: " << RC << "\n";<br>
> +<br>
> + for (LazyCallGraph::SCC &C : RC) {<br>
> PreservedAnalyses PassPA = Pass.run(C, CGAM);<br>
><br>
> // We know that the CGSCC pass couldn't have invalidated any other<br>
> @@ -115,6 +119,7 @@ public:<br>
> // analyses will eventually occur when the module pass completes.<br>
> PA.intersect(std::move(PassPA));<br>
> }<br>
> + }<br>
><br>
> // By definition we preserve the proxy. This precludes *any* invalidation<br>
> // of CGSCC analyses by the proxy, but that's OK because we've taken<br>
> @@ -126,14 +131,15 @@ public:<br>
><br>
> private:<br>
> CGSCCPassT Pass;<br>
> + bool DebugLogging;<br>
> };<br>
><br>
> /// \brief A function to deduce a function pass type and wrap it in the<br>
> /// templated adaptor.<br>
> template <typename CGSCCPassT><br>
> ModuleToPostOrderCGSCCPassAdaptor<CGSCCPassT><br>
> -createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT Pass) {<br>
> - return ModuleToPostOrderCGSCCPassAdaptor<CGSCCPassT>(std::move(Pass));<br>
> +createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT Pass, bool DebugLogging = false) {<br>
> + return ModuleToPostOrderCGSCCPassAdaptor<CGSCCPassT>(std::move(Pass), DebugLogging);<br>
> }<br>
><br>
> extern template class InnerAnalysisManagerProxy<FunctionAnalysisManager,<br>
> @@ -159,18 +165,19 @@ template <typename FunctionPassT><br>
> class CGSCCToFunctionPassAdaptor<br>
> : public PassInfoMixin<CGSCCToFunctionPassAdaptor<FunctionPassT>> {<br>
> public:<br>
> - explicit CGSCCToFunctionPassAdaptor(FunctionPassT Pass)<br>
> - : Pass(std::move(Pass)) {}<br>
> + explicit CGSCCToFunctionPassAdaptor(FunctionPassT Pass, bool DebugLogging = false)<br>
> + : Pass(std::move(Pass)), DebugLogging(DebugLogging) {}<br>
> // We have to explicitly define all the special member functions because MSVC<br>
> // refuses to generate them.<br>
> CGSCCToFunctionPassAdaptor(const CGSCCToFunctionPassAdaptor &Arg)<br>
> - : Pass(Arg.Pass) {}<br>
> + : Pass(Arg.Pass), DebugLogging(Arg.DebugLogging) {}<br>
> CGSCCToFunctionPassAdaptor(CGSCCToFunctionPassAdaptor &&Arg)<br>
> - : Pass(std::move(Arg.Pass)) {}<br>
> + : Pass(std::move(Arg.Pass)), DebugLogging(Arg.DebugLogging) {}<br>
> friend void swap(CGSCCToFunctionPassAdaptor &LHS,<br>
> CGSCCToFunctionPassAdaptor &RHS) {<br>
> using std::swap;<br>
> swap(LHS.Pass, RHS.Pass);<br>
> + swap(LHS.DebugLogging, RHS.DebugLogging);<br>
> }<br>
> CGSCCToFunctionPassAdaptor &operator=(CGSCCToFunctionPassAdaptor RHS) {<br>
> swap(*this, RHS);<br>
> @@ -183,6 +190,9 @@ public:<br>
> FunctionAnalysisManager &FAM =<br>
> AM.getResult<FunctionAnalysisManagerCGSCCProxy>(C).getManager();<br>
><br>
> + if (DebugLogging)<br>
> + dbgs() << "Running function passes across an SCC: " << C << "\n";<br>
> +<br>
> PreservedAnalyses PA = PreservedAnalyses::all();<br>
> for (LazyCallGraph::Node &N : C) {<br>
> PreservedAnalyses PassPA = Pass.run(N.getFunction(), FAM);<br>
> @@ -211,14 +221,16 @@ public:<br>
><br>
> private:<br>
> FunctionPassT Pass;<br>
> + bool DebugLogging;<br>
> };<br>
><br>
> /// \brief A function to deduce a function pass type and wrap it in the<br>
> /// templated adaptor.<br>
> template <typename FunctionPassT><br>
> CGSCCToFunctionPassAdaptor<FunctionPassT><br>
> -createCGSCCToFunctionPassAdaptor(FunctionPassT Pass) {<br>
> - return CGSCCToFunctionPassAdaptor<FunctionPassT>(std::move(Pass));<br>
> +createCGSCCToFunctionPassAdaptor(FunctionPassT Pass, bool DebugLogging = false) {<br>
> + return CGSCCToFunctionPassAdaptor<FunctionPassT>(std::move(Pass),<br>
> + DebugLogging);<br>
> }<br>
> }<br>
><br>
><br>
> Modified: llvm/trunk/include/llvm/Analysis/LazyCallGraph.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LazyCallGraph.h?rev=273961&r1=273960&r2=273961&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LazyCallGraph.h?rev=273961&r1=273960&r2=273961&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/include/llvm/Analysis/LazyCallGraph.h (original)<br>
> +++ llvm/trunk/include/llvm/Analysis/LazyCallGraph.h Mon Jun 27 18:26:08 2016<br>
> @@ -48,6 +48,7 @@<br>
> #include "llvm/IR/Module.h"<br>
> #include "llvm/IR/PassManager.h"<br>
> #include "llvm/Support/Allocator.h"<br>
> +#include "llvm/Support/raw_ostream.h"<br>
> #include <iterator><br>
> #include <utility><br>
><br>
> @@ -222,6 +223,12 @@ public:<br>
> /// Internal helper to remove the edge to the given function.<br>
> void removeEdgeInternal(Function &ChildF);<br>
><br>
> + /// Print the name of this node's function.<br>
> + friend raw_ostream &operator<<(raw_ostream &OS, const Node &N);<br>
> +<br>
> + /// Dump the name of this node's function to stderr.<br>
> + void dump() const;<br>
> +<br>
> public:<br>
> LazyCallGraph &getGraph() const { return *G; }<br>
><br>
> @@ -353,6 +360,15 @@ public:<br>
> Nodes.clear();<br>
> }<br>
><br>
> + /// Print a short descrtiption useful for debugging or logging.<br>
> + ///<br>
> + /// We print the function names in the SCC wrapped in '()'s and skipping<br>
> + /// the middle functions if there are a large number.<br>
> + friend raw_ostream &operator<<(raw_ostream &OS, const SCC &C);<br>
> +<br>
> + /// Dump a short description of this SCC to stderr.<br>
> + void dump() const;<br>
> +<br>
> #ifndef NDEBUG<br>
> /// Verify invariants about the SCC.<br>
> ///<br>
> @@ -373,25 +389,15 @@ public:<br>
><br>
> RefSCC &getOuterRefSCC() const { return *OuterRefSCC; }<br>
><br>
> - /// Short name useful for debugging or logging.<br>
> + /// Provide a short name by printing this SCC to a std::string.<br>
> ///<br>
> - /// We use the name of the first function in the SCC to name the SCC for<br>
> - /// the purposes of debugging and logging.<br>
> + /// This copes with the fact that we don't have a name per-se for an SCC<br>
> + /// while still making the use of this in debugging and logging useful.<br>
> std::string getName() const {<br>
> std::string Name;<br>
> - int i = 0;<br>
> - for (Node &N : *this) {<br>
> - if (i > 0)<br>
> - Name += ", ";<br>
> - // Elide the inner elements if there are too many.<br>
> - if (i > 8) {<br>
> - Name += "..., ";<br>
> - Name += Nodes.back()->getFunction().getName().str();<br>
> - break;<br>
> - }<br>
> - Name += N.getFunction().getName().str();<br>
> - ++i;<br>
> - }<br>
> + raw_string_ostream OS(Name);<br>
> + OS << *this;<br>
> + OS.flush();<br>
> return Name;<br>
> }<br>
> };<br>
> @@ -426,6 +432,15 @@ public:<br>
> /// formRefSCCFast on the graph itself.<br>
> RefSCC(LazyCallGraph &G);<br>
><br>
> + /// Print a short description useful for debugging or logging.<br>
> + ///<br>
> + /// We print the SCCs wrapped in '[]'s and skipping the middle SCCs if<br>
> + /// there are a large number.<br>
> + friend raw_ostream &operator<<(raw_ostream &OS, const RefSCC &RC);<br>
> +<br>
> + /// Dump a short description of this RefSCC to stderr.<br>
> + void dump() const;<br>
> +<br>
> #ifndef NDEBUG<br>
> /// Verify invariants about the RefSCC and all its SCCs.<br>
> ///<br>
> @@ -477,12 +492,16 @@ public:<br>
> /// Test if this RefSCC is a descendant of \a C.<br>
> bool isDescendantOf(const RefSCC &C) const;<br>
><br>
> - /// Short name useful for debugging or logging.<br>
> + /// Provide a short name by printing this SCC to a std::string.<br>
> ///<br>
> - /// We use the name of the first function in the SCC to name the SCC for<br>
> - /// the purposes of debugging and logging.<br>
> - StringRef getName() const {<br>
> - return begin()->begin()->getFunction().getName();<br>
> + /// This copes with the fact that we don't have a name per-se for an SCC<br>
> + /// while still making the use of this in debugging and logging useful.<br>
> + std::string getName() const {<br>
> + std::string Name;<br>
> + raw_string_ostream OS(Name);<br>
> + OS << *this;<br>
> + OS.flush();<br>
> + return Name;<br>
> }<br>
><br>
> ///@{<br>
><br>
> Modified: llvm/trunk/lib/Analysis/LazyCallGraph.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LazyCallGraph.cpp?rev=273961&r1=273960&r2=273961&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LazyCallGraph.cpp?rev=273961&r1=273960&r2=273961&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Analysis/LazyCallGraph.cpp (original)<br>
> +++ llvm/trunk/lib/Analysis/LazyCallGraph.cpp Mon Jun 27 18:26:08 2016<br>
> @@ -120,6 +120,14 @@ void LazyCallGraph::Node::removeEdgeInte<br>
> EdgeIndexMap.erase(IndexMapI);<br>
> }<br>
><br>
> +raw_ostream &llvm::operator<<(raw_ostream &OS, const LazyCallGraph::Node &N) {<br>
> + return OS << N.F.getName();<br>
> +}<br>
> +<br>
> +void LazyCallGraph::Node::dump() const {<br>
> + dbgs() << *this << '\n';<br>
> +}<br>
> +<br>
> LazyCallGraph::LazyCallGraph(Module &M) : NextDFSNumber(0) {<br>
> DEBUG(dbgs() << "Building CG for module: " << M.getModuleIdentifier()<br>
> << "\n");<br>
> @@ -173,6 +181,28 @@ LazyCallGraph &LazyCallGraph::operator=(<br>
> return *this;<br>
> }<br>
><br>
> +raw_ostream &llvm::operator<<(raw_ostream &OS, const LazyCallGraph::SCC &C) {<br>
> + OS << '(';<br>
> + int i = 0;<br>
> + for (LazyCallGraph::Node &N : C) {<br>
> + if (i > 0)<br>
> + OS << ", ";<br>
> + // Elide the inner elements if there are too many.<br>
> + if (i > 8) {<br>
> + OS << "..., " << *C.Nodes.back();<br>
> + break;<br>
> + }<br>
> + OS << N;<br>
> + ++i;<br>
> + }<br>
> + OS << ')';<br>
> + return OS;<br>
> +}<br>
> +<br>
> +void LazyCallGraph::SCC::dump() const {<br>
> + dbgs() << *this << '\n';<br>
> +}<br>
> +<br>
> #ifndef NDEBUG<br>
> void LazyCallGraph::SCC::verify() {<br>
> assert(OuterRefSCC && "Can't have a null RefSCC!");<br>
> @@ -194,6 +224,29 @@ void LazyCallGraph::SCC::verify() {<br>
><br>
> LazyCallGraph::RefSCC::RefSCC(LazyCallGraph &G) : G(&G) {}<br>
><br>
> +raw_ostream &llvm::operator<<(raw_ostream &OS,<br>
> + const LazyCallGraph::RefSCC &RC) {<br>
> + OS << '[';<br>
> + int i = 0;<br>
> + for (LazyCallGraph::SCC &C : RC) {<br>
> + if (i > 0)<br>
> + OS << ", ";<br>
> + // Elide the inner elements if there are too many.<br>
> + if (i > 4) {<br>
> + OS << "..., " << *RC.SCCs.back();<br>
> + break;<br>
> + }<br>
> + OS << C;<br>
> + ++i;<br>
> + }<br>
> + OS << ']';<br>
> + return OS;<br>
> +}<br>
> +<br>
> +void LazyCallGraph::RefSCC::dump() const {<br>
> + dbgs() << *this << '\n';<br>
> +}<br>
> +<br>
> #ifndef NDEBUG<br>
> void LazyCallGraph::RefSCC::verify() {<br>
> assert(G && "Can't have a null graph!");<br>
><br>
> Modified: llvm/trunk/lib/Passes/PassBuilder.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=273961&r1=273960&r2=273961&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=273961&r1=273960&r2=273961&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Passes/PassBuilder.cpp (original)<br>
> +++ llvm/trunk/lib/Passes/PassBuilder.cpp Mon Jun 27 18:26:08 2016<br>
> @@ -561,7 +561,8 @@ bool PassBuilder::parseCGSCCPassPipeline<br>
> PipelineText = PipelineText.substr(1);<br>
><br>
> // Add the nested pass manager with the appropriate adaptor.<br>
> - CGPM.addPass(createCGSCCToFunctionPassAdaptor(std::move(NestedFPM)));<br>
> + CGPM.addPass(<br>
> + createCGSCCToFunctionPassAdaptor(std::move(NestedFPM), DebugLogging));<br>
> } else {<br>
> // Otherwise try to parse a pass name.<br>
> size_t End = PipelineText.find_first_of(",)");<br>
> @@ -627,8 +628,8 @@ bool PassBuilder::parseModulePassPipelin<br>
> PipelineText = PipelineText.substr(1);<br>
><br>
> // Add the nested pass manager with the appropriate adaptor.<br>
> - MPM.addPass(<br>
> - createModuleToPostOrderCGSCCPassAdaptor(std::move(NestedCGPM)));<br>
> + MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(NestedCGPM),<br>
> + DebugLogging));<br>
> } else if (PipelineText.startswith("function(")) {<br>
> FunctionPassManager NestedFPM(DebugLogging);<br>
><br>
> @@ -689,7 +690,7 @@ bool PassBuilder::parsePassPipeline(Modu<br>
> DebugLogging) ||<br>
> !PipelineText.empty())<br>
> return false;<br>
> - MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM)));<br>
> + MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM), DebugLogging));<br>
> return true;<br>
> }<br>
><br>
><br>
> Modified: llvm/trunk/test/Other/new-pass-manager.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/new-pass-manager.ll?rev=273961&r1=273960&r2=273961&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/new-pass-manager.ll?rev=273961&r1=273960&r2=273961&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/Other/new-pass-manager.ll (original)<br>
> +++ llvm/trunk/test/Other/new-pass-manager.ll Mon Jun 27 18:26:08 2016<br>
> @@ -22,6 +22,7 @@<br>
> ; CHECK-CGSCC-PASS-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<br>
> ; CHECK-CGSCC-PASS-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}><br>
> ; CHECK-CGSCC-PASS-NEXT: Running analysis: LazyCallGraphAnalysis<br>
> +; CHECK-CGSCC-PASS-NEXT: Running an SCC pass across the RefSCC: [(foo)]<br>
> ; CHECK-CGSCC-PASS-NEXT: Starting llvm::LazyCallGraph::SCC pass manager run<br>
> ; CHECK-CGSCC-PASS-NEXT: Running pass: NoOpCGSCCPass<br>
> ; CHECK-CGSCC-PASS-NEXT: Finished llvm::LazyCallGraph::SCC pass manager run<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br>
--<br>
Davide<br>
<br>
"There are no solved problems; there are only problems that are more<br>
or less solved" -- Henri Poincare<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div></div>
<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div></div>