[llvm-branch-commits] [llvm-branch] r329485 - Merging r327761:

Tom Stellard via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Apr 6 22:20:49 PDT 2018


Author: tstellar
Date: Fri Apr  6 22:20:48 2018
New Revision: 329485

URL: http://llvm.org/viewvc/llvm-project?rev=329485&view=rev
Log:
Merging r327761:

------------------------------------------------------------------------
r327761 | chandlerc | 2018-03-16 16:51:33 -0700 (Fri, 16 Mar 2018) | 20 lines

[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.
------------------------------------------------------------------------

Modified:
    llvm/branches/release_60/lib/Analysis/GlobalsModRef.cpp

Modified: llvm/branches/release_60/lib/Analysis/GlobalsModRef.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_60/lib/Analysis/GlobalsModRef.cpp?rev=329485&r1=329484&r2=329485&view=diff
==============================================================================
--- llvm/branches/release_60/lib/Analysis/GlobalsModRef.cpp (original)
+++ llvm/branches/release_60/lib/Analysis/GlobalsModRef.cpp Fri Apr  6 22:20:48 2018
@@ -502,6 +502,8 @@ void GlobalsAAResult::AnalyzeCallGraph(C
     }
 
     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




More information about the llvm-branch-commits mailing list