summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2018-03-16 23:51:33 +0000
committerChandler Carruth <chandlerc@gmail.com>2018-03-16 23:51:33 +0000
commit196a9fab820a1ed825aafefc23c9030b0cf66715 (patch)
tree5e2b2b106b16b6f894d4287ec2b4ca39625a1e8f
parentb3e7dc9144eee605a6456e6aef94a8e0a77c6cdb (diff)
downloadbcm5719-llvm-196a9fab820a1ed825aafefc23c9030b0cf66715.tar.gz
bcm5719-llvm-196a9fab820a1ed825aafefc23c9030b0cf66715.zip
[GlobalsAA] Fix a pretty terrible bug that has been in GlobalsAA for
a long time. The key thing is that we need to create value handles for every function that we create a `FunctionInfo` object around. Without this, when that function is deleted we can end up creating a new function that collides with its address and look up a stale AA result. With that AA result we can in turn miscompile code in ways that break. This is seriously one of the most absurd miscompiles I've seen. It only reproduced for us recently and only when building a very large server with both ThinLTO and PGO. A *HUGE* shout out to Wei Mi who tracked all of this down and came up with this patch. I'm just landing it because I happened to still by at a computer. He or I can work on crafting a test case to hit this (now that we know what to target) but it'll take a while, and we've been chasing this for a long time and need it fix Right Now. llvm-svn: 327761
-rw-r--r--llvm/lib/Analysis/GlobalsModRef.cpp2
1 files changed, 2 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/GlobalsModRef.cpp b/llvm/lib/Analysis/GlobalsModRef.cpp
index 9f33b94b134..44d61a94422 100644
--- a/llvm/lib/Analysis/GlobalsModRef.cpp
+++ b/llvm/lib/Analysis/GlobalsModRef.cpp
@@ -502,6 +502,8 @@ void GlobalsAAResult::AnalyzeCallGraph(CallGraph &CG, Module &M) {
}
FunctionInfo &FI = FunctionInfos[F];
+ Handles.emplace_front(*this, F);
+ Handles.front().I = Handles.begin();
bool KnowNothing = false;
// Collect the mod/ref properties due to called functions. We only compute
OpenPOWER on IntegriCloud