mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
[MergeFuncs] Call removeUsers() prior to unnamed_addr RAUW
Summary: For unnamed_addr functions we RAUW instead of only replacing direct callers. However, functions in which replacements were performed currently are not added back to the worklist, resulting in missed merging opportunities. Fix this by calling removeUsers() prior to RAUW. Reviewers: jfb, whitequark Reviewed By: whitequark Subscribers: rkruppe, llvm-commits Differential Revision: https://reviews.llvm.org/D53262 llvm-svn: 346385
This commit is contained in:
parent
b3aea855b4
commit
882e2c9269
@ -770,6 +770,7 @@ void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) {
|
||||
GlobalNumbers.erase(G);
|
||||
// If G's address is not significant, replace it entirely.
|
||||
Constant *BitcastF = ConstantExpr::getBitCast(F, G->getType());
|
||||
removeUsers(G);
|
||||
G->replaceAllUsesWith(BitcastF);
|
||||
} else {
|
||||
// Redirect direct callers of G to F. (See note on MergeFunctionsPDI
|
||||
|
35
test/Transforms/MergeFunc/unnamed-addr-reprocessing.ll
Normal file
35
test/Transforms/MergeFunc/unnamed-addr-reprocessing.ll
Normal file
@ -0,0 +1,35 @@
|
||||
; RUN: opt -S -mergefunc < %s | FileCheck %s
|
||||
|
||||
; After test3 and test4 have been merged, we should detect that
|
||||
; test1 and test2 can also be merged.
|
||||
|
||||
; CHECK: define void @test4() unnamed_addr
|
||||
; CHECK-NEXT: tail call void @test3()
|
||||
; CHECK: define void @test2() unnamed_addr
|
||||
; CHECK-NEXT: tail call void @test1()
|
||||
|
||||
declare void @dummy()
|
||||
|
||||
define void @test1() unnamed_addr {
|
||||
call void @test3()
|
||||
call void @test3()
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test2() unnamed_addr {
|
||||
call void @test4()
|
||||
call void @test4()
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test3() unnamed_addr {
|
||||
call void @dummy()
|
||||
call void @dummy()
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test4() unnamed_addr {
|
||||
call void @dummy()
|
||||
call void @dummy()
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user