From 18c9dd31de61d8587f98d35bd47f0aceb216ba9f Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Fri, 19 Jun 2015 23:20:31 +0000 Subject: [PATCH] [CallGraph] Given -print-callgraph a stable printing order. Summary: Since FunctionMap has llvm::Function pointers as keys, the order in which the traversal happens can differ from run to run, causing spurious FileCheck failures. Have CallGraph::print sort the CallGraphNodes by name before printing them. Reviewers: bogner, chandlerc Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D10575 llvm-svn: 240191 --- llvm/lib/Analysis/IPA/CallGraph.cpp | 22 ++++++++++++++++++++-- .../test/Analysis/CallGraph/non-leaf-intrinsics.ll | 6 +++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Analysis/IPA/CallGraph.cpp b/llvm/lib/Analysis/IPA/CallGraph.cpp index 77c3603..e2799d9 100644 --- a/llvm/lib/Analysis/IPA/CallGraph.cpp +++ b/llvm/lib/Analysis/IPA/CallGraph.cpp @@ -98,8 +98,26 @@ void CallGraph::print(raw_ostream &OS) const { OS << "<>\n"; } - for (CallGraph::const_iterator I = begin(), E = end(); I != E; ++I) - I->second->print(OS); + // Print in a deterministic order by sorting CallGraphNodes by name. We do + // this here to avoid slowing down the non-printing fast path. + + SmallVector Nodes; + Nodes.reserve(FunctionMap.size()); + + for (auto I = begin(), E = end(); I != E; ++I) + Nodes.push_back(I->second); + + std::sort(Nodes.begin(), Nodes.end(), + [](CallGraphNode *LHS, CallGraphNode *RHS) { + if (Function *LF = LHS->getFunction()) + if (Function *RF = RHS->getFunction()) + return LF->getName() < RF->getName(); + + return RHS->getFunction() != nullptr; + }); + + for (CallGraphNode *CN : Nodes) + CN->print(OS); } #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) diff --git a/llvm/test/Analysis/CallGraph/non-leaf-intrinsics.ll b/llvm/test/Analysis/CallGraph/non-leaf-intrinsics.ll index ae6ba328..11bed6a 100644 --- a/llvm/test/Analysis/CallGraph/non-leaf-intrinsics.ll +++ b/llvm/test/Analysis/CallGraph/non-leaf-intrinsics.ll @@ -25,8 +25,8 @@ entry: ; CHECK: Call graph node <> ; CHECK: CS<0x0> calls function 'f' -; CHECK: Call graph node for function: 'calls_statepoint' -; CHECK-NEXT: CS<[[addr_0:[^>]+]]> calls external node - ; CHECK: Call graph node for function: 'calls_patchpoint' ; CHECK-NEXT: CS<[[addr_1:[^>]+]]> calls external node + +; CHECK: Call graph node for function: 'calls_statepoint' +; CHECK-NEXT: CS<[[addr_0:[^>]+]]> calls external node -- 2.7.4