llvm/test/Analysis
Chandler Carruth a59e5882a0 [LCG] Construct an actual call graph with call-edge SCCs nested inside
reference-edge SCCs.

This essentially builds a more normal call graph as a subgraph of the
"reference graph" that was the old model. This allows both to exist and
the different use cases to use the aspect which addresses their needs.
Specifically, the pass manager and other *ordering* constrained logic
can use the reference graph to achieve conservative order of visit,
while analyses reasoning about attributes and other properties derived
from reachability can reason about the direct call graph.

Note that this isn't necessarily complete: it doesn't model edges to
declarations or indirect calls. Those can be found by scanning the
instructions of the function if desirable, and in fact every user
currently does this in order to handle things like calls to instrinsics.
If useful, we could consider caching this information in the call graph
to save the instruction scans, but currently that doesn't seem to be
important.

An important realization for why the representation chosen here works is
that the call graph is a formal subset of the reference graph and thus
both can live within the same data structure. All SCCs of the call graph
are necessarily contained within an SCC of the reference graph, etc.

The design is to build 'RefSCC's to model SCCs of the reference graph,
and then within them more literal SCCs for the call graph.

The formation of actual call edge SCCs is not done lazily, unlike
reference edge 'RefSCC's. Instead, once a reference SCC is formed, it
directly builds the call SCCs within it and stores them in a post-order
sequence. This is used to provide a consistent platform for mutation and
update of the graph. The post-order also allows for very efficient
updates in common cases by bounding the number of nodes (and thus edges)
considered.

There is considerable common code that I'm still looking for the best
way to factor out between the various DFS implementations here. So far,
my attempts have made the code harder to read and understand despite
reducing the duplication, which seems a poor tradeoff. I've not given up
on figuring out the right way to do this, but I wanted to wait until
I at least had the system working and tested to continue attempting to
factor it differently.

This also requires introducing several new algorithms in order to handle
all of the incremental update scenarios for the more complex structure
involving two edge colorings. I've tried to comment the algorithms
sufficiently to make it clear how this is expected to work, but they may
still need more extensive documentation.

I know that there are some changes which are not strictly necessarily
coupled here. The process of developing this started out with a very
focused set of changes for the new structure of the graph and
algorithms, but subsequent changes to bring the APIs and code into
consistent and understandable patterns also ended up touching on other
aspects. There was no good way to separate these out without causing
*massive* merge conflicts. Ultimately, to a large degree this is
a rewrite of most of the core algorithms in the LCG class and so I don't
think it really matters much.

Many thanks to the careful review by Sanjoy Das!

Differential Revision: http://reviews.llvm.org/D16802

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261040 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-17 00:18:16 +00:00
..
AssumptionCache [PM] Actually add the new pass manager support for the assumption cache. 2015-01-22 21:53:09 +00:00
BasicAA [BasicAA] Fix for missing must alias (D16343) 2016-01-30 05:52:53 +00:00
BlockFrequencyInfo Use getEdgeProbability() instead of getEdgeWeight() in BFI and remove getEdgeWeight() interfaces from MBPI. 2015-12-18 21:53:24 +00:00
BranchProbabilityInfo [BPI] Replace weights by probabilities in BPI. 2015-12-22 18:56:14 +00:00
CallGraph [gc.statepoint] Change gc.statepoint intrinsic's return type to token type instead of i32 type 2015-12-26 07:54:32 +00:00
CFLAliasAnalysis [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
CostModel Implemented cost model for masked gather and scatter operations 2015-12-28 20:10:59 +00:00
Delinearization [SCEV] Mark AddExprs as nsw or nuw if legal 2015-10-22 19:57:19 +00:00
DemandedBits [DemandedBits] Revert r249687 due to PR26071 2016-02-03 15:05:06 +00:00
DependenceAnalysis Revert "Change memcpy/memset/memmove to have dest and source alignments." 2015-11-19 05:56:52 +00:00
DivergenceAnalysis AMDGPU: Fix not handling new workitem intrinsics in DivergenceAnalysis 2016-02-11 05:32:51 +00:00
Dominators Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
GlobalsModRef [GlobalsAA] Relax condition in checking globals as args to functions 2016-01-14 08:46:45 +00:00
LazyCallGraph [LCG] Construct an actual call graph with call-edge SCCs nested inside 2016-02-17 00:18:16 +00:00
Lint [WinEH] Delete the old landingpad implementation of Windows EH 2015-10-09 23:34:53 +00:00
LoopAccessAnalysis [SCEV][LAA] Re-commit r260085 and r260086, this time with a fix for the memory 2016-02-08 17:02:45 +00:00
LoopInfo [PM] Port LoopInfo to the new pass manager, adding both a LoopAnalysis 2015-01-20 10:58:50 +00:00
MemoryDependenceAnalysis [MDA] change BlockScanLimit into a command line option. 2015-07-21 21:50:39 +00:00
PostDominators FileCheck-ize tests. 2013-08-22 00:51:19 +00:00
RegionInfo [tests] Cleanup initialization of test suffixes. 2013-08-16 00:37:11 +00:00
ScalarEvolution This patch is to fix PR26529 caused by r259736. 2016-02-09 00:07:08 +00:00
ScopedNoAliasAA [Testsuite] Renumber metadata in ScopedNoAliasAA test to match CHECK lines 2015-05-11 09:10:14 +00:00
TypeBasedAliasAnalysis [attrs] Move the norecurse deduction to operate on the node set rather 2016-02-13 08:47:51 +00:00
ValueTracking Revert "[ValueTracking] Understand more select patterns in ComputeKnownBits" 2016-01-14 15:49:32 +00:00
alias-analysis-uses.ll Add an "addUsedAAAnalyses" helper function 2016-02-09 01:21:57 +00:00