summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2011-03-01 00:33:47 +0000
committerEli Friedman <eli.friedman@gmail.com>2011-03-01 00:33:47 +0000
commit683bbc16c49fc819f4c1a73571e4f6b8b4976356 (patch)
tree4970e26a398e15dc3875439d1285711cd0eea861
parent0c6cb46ac107565b8db848b071071559f0d6688f (diff)
downloadbcm5719-llvm-683bbc16c49fc819f4c1a73571e4f6b8b4976356.tar.gz
bcm5719-llvm-683bbc16c49fc819f4c1a73571e4f6b8b4976356.zip
Add an obvious missing safety check to DAE::RemoveDeadArgumentsFromCallers.
llvm-svn: 126720
-rw-r--r--llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp2
-rw-r--r--llvm/test/Transforms/DeadArgElim/deadexternal.ll13
2 files changed, 14 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
index b42322116a9..4d1f7abdc32 100644
--- a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
+++ b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
@@ -294,7 +294,7 @@ bool DAE::DeleteDeadVarargs(Function &Fn) {
/// instead.
bool DAE::RemoveDeadArgumentsFromCallers(Function &Fn)
{
- if (Fn.isDeclaration())
+ if (Fn.isDeclaration() || Fn.mayBeOverridden())
return false;
// Functions with local linkage should already have been handled.
diff --git a/llvm/test/Transforms/DeadArgElim/deadexternal.ll b/llvm/test/Transforms/DeadArgElim/deadexternal.ll
index 5a80aba6e2d..84092613130 100644
--- a/llvm/test/Transforms/DeadArgElim/deadexternal.ll
+++ b/llvm/test/Transforms/DeadArgElim/deadexternal.ll
@@ -37,3 +37,16 @@ entry:
call void @f(i32 %tmp)
ret void
}
+
+; Check that callers are not transformed for weak definitions.
+define weak i32 @weak_f(i32 %x) nounwind {
+entry:
+ ret i32 0
+}
+define void @weak_f_caller() nounwind {
+entry:
+; CHECK: call i32 @weak_f(i32 10)
+ %call = tail call i32 @weak_f(i32 10)
+ ret void
+}
+
OpenPOWER on IntegriCloud