mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[MergeFunc] Erase unused duplicate functions if they are discardable
MergeFunc only deletes unused duplicate functions if they have local linkage, but it should be safe to relax this to any "discardable if unused" linkage type. Differential Revision: https://reviews.llvm.org/D56574 llvm-svn: 350939
This commit is contained in:
parent
fae3f2471d
commit
de4374ce0b
@ -845,7 +845,7 @@ void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) {
|
||||
// If G was internal then we may have replaced all uses of G with F. If so,
|
||||
// stop here and delete G. There's no need for a thunk. (See note on
|
||||
// MergeFunctionsPDI above).
|
||||
if (G->hasLocalLinkage() && G->use_empty() && !MergeFunctionsPDI) {
|
||||
if (G->isDiscardableIfUnused() && G->use_empty() && !MergeFunctionsPDI) {
|
||||
G->eraseFromParent();
|
||||
++NumFunctionsMerged;
|
||||
return;
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: opt -S -mergefunc < %s | FileCheck %s
|
||||
; RUN: opt -S -mergefunc < %s | FileCheck %s -implicit-check-not=funC
|
||||
|
||||
; Replacments should be totally ordered on the function name.
|
||||
; If we don't do this we can end up with one module defining a thunk for @funA
|
||||
@ -15,6 +15,13 @@
|
||||
; CHECK-NEXT: tail call i32 @funA(i32 %0, i32 %1)
|
||||
; CHECK-NEXT: ret
|
||||
|
||||
define linkonce_odr i32 @funC(i32 %x, i32 %y) {
|
||||
%sum = add i32 %x, %y
|
||||
%sum2 = add i32 %x, %sum
|
||||
%sum3 = add i32 %x, %sum2
|
||||
ret i32 %sum3
|
||||
}
|
||||
|
||||
define linkonce_odr i32 @funB(i32 %x, i32 %y) {
|
||||
%sum = add i32 %x, %y
|
||||
%sum2 = add i32 %x, %sum
|
||||
@ -28,3 +35,8 @@ define linkonce_odr i32 @funA(i32 %x, i32 %y) {
|
||||
%sum3 = add i32 %x, %sum2
|
||||
ret i32 %sum3
|
||||
}
|
||||
|
||||
; This creates a use of @funB, preventing -mergefunc from deleting it.
|
||||
; @funC, however, can safely be deleted as it has no uses, and is discardable
|
||||
; if unused.
|
||||
@take_addr_of_funB = global i8* bitcast (i32 (i32, i32)* @funB to i8*)
|
||||
|
Loading…
x
Reference in New Issue
Block a user