Index: llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp =================================================================== --- llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp +++ llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp @@ -770,6 +770,7 @@ 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 Index: llvm/trunk/test/Transforms/MergeFunc/unnamed-addr-reprocessing.ll =================================================================== --- llvm/trunk/test/Transforms/MergeFunc/unnamed-addr-reprocessing.ll +++ llvm/trunk/test/Transforms/MergeFunc/unnamed-addr-reprocessing.ll @@ -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 +}