Add an obvious missing safety check to DAE::RemoveDeadArgumentsFromCallers.
authorEli Friedman <eli.friedman@gmail.com>
Tue, 1 Mar 2011 00:33:47 +0000 (00:33 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 1 Mar 2011 00:33:47 +0000 (00:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126720 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/DeadArgumentElimination.cpp
test/Transforms/DeadArgElim/deadexternal.ll

index b42322116a98fc860a68265904cca009bb217212..4d1f7abdc32ee64dd1d3b591c1a4bbd759924a36 100644 (file)
@@ -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.
index 5a80aba6e2db04d43a2528d8589384a7eb00dac5..84092613130b7885dc758333707299c316d6f279 100644 (file)
@@ -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
+}
+