[llvm] r219335 - Inliner: Non-local functions in COMDATs shouldn't be dropped
David Majnemer
david.majnemer at gmail.com
Wed Oct 8 12:32:33 PDT 2014
Author: majnemer
Date: Wed Oct 8 14:32:32 2014
New Revision: 219335
URL: http://llvm.org/viewvc/llvm-project?rev=219335&view=rev
Log:
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.
Added:
llvm/trunk/test/Transforms/Inline/pr21206.ll
Modified:
llvm/trunk/lib/Transforms/IPO/Inliner.cpp
Modified: llvm/trunk/lib/Transforms/IPO/Inliner.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/Inliner.cpp?rev=219335&r1=219334&r2=219335&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/Inliner.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/Inliner.cpp Wed Oct 8 14:32:32 2014
@@ -669,6 +669,13 @@ bool Inliner::removeDeadFunctions(CallGr
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();
Added: llvm/trunk/test/Transforms/Inline/pr21206.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/pr21206.ll?rev=219335&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/Inline/pr21206.ll (added)
+++ llvm/trunk/test/Transforms/Inline/pr21206.ll Wed Oct 8 14:32:32 2014
@@ -0,0 +1,18 @@
+; RUN: opt < %s -inline -S | FileCheck %s
+
+$c = comdat any
+; CHECK: $c = comdat any
+
+define linkonce_odr void @foo() comdat $c {
+ ret void
+}
+; CHECK: define linkonce_odr void @foo() comdat $c
+
+define linkonce_odr void @bar() comdat $c {
+ ret void
+}
+; CHECK: define linkonce_odr void @bar() comdat $c
+
+define void()* @zed() {
+ ret void()* @foo
+}
More information about the llvm-commits
mailing list