diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-10-08 19:32:32 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-10-08 19:32:32 +0000 |
commit | ac07703842cfa40d135145e10440d777e4c37356 (patch) | |
tree | 9f5186fef57023d93ed7be1043c09b02628cd7fb /llvm/lib/Transforms/IPO/Inliner.cpp | |
parent | ce1af1a201c8dc05c05fd1f36a731e0a0fc5b43d (diff) | |
download | bcm5719-llvm-ac07703842cfa40d135145e10440d777e4c37356.tar.gz bcm5719-llvm-ac07703842cfa40d135145e10440d777e4c37356.zip |
Inliner: Non-local functions in COMDATs shouldn't be dropped
A function with discardable linkage cannot be discarded if its a member
of a COMDAT group without considering all the other COMDAT members as
well. This sort of thing is already handled by GlobalOpt/GlobalDCE.
This fixes PR21206.
llvm-svn: 219335
Diffstat (limited to 'llvm/lib/Transforms/IPO/Inliner.cpp')
-rw-r--r-- | llvm/lib/Transforms/IPO/Inliner.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/Inliner.cpp b/llvm/lib/Transforms/IPO/Inliner.cpp index de979504742..4ce6dfed7c4 100644 --- a/llvm/lib/Transforms/IPO/Inliner.cpp +++ b/llvm/lib/Transforms/IPO/Inliner.cpp @@ -669,6 +669,13 @@ bool Inliner::removeDeadFunctions(CallGraph &CG, bool AlwaysInlineOnly) { if (!F->isDefTriviallyDead()) continue; + + // It is unsafe to drop a function with discardable linkage from a COMDAT + // without also dropping the other members of the COMDAT. + // The inliner doesn't visit non-function entities which are in COMDAT + // groups so it is unsafe to do so *unless* the linkage is local. + if (!F->hasLocalLinkage() && F->hasComdat()) + continue; // Remove any call graph edges from the function to its callees. CGN->removeAllCalledFunctions(); |