1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00
llvm-mirror/test/Transforms/MergeFunc/unnamed-addr-reprocessing.ll
Fangrui Song 3937810b23 [MergeFunc] removeUsers: call remove() only on direct users
removeUsers uses a work list to collect indirect users and call remove()
on those functions. However it has a bug (`if (!Visited.insert(UU).second)`).

Actually, we don't have to collect indirect users.
After the merge of F and G, G's callers will be considered (added to
Deferred). If G's callers can be merged, G's callers' callers will be
considered.

Update the test unnamed-addr-reprocessing.ll to make it clear we can
still merge indirect callers.

llvm-svn: 358741
2019-04-19 07:57:51 +00:00

50 lines
993 B
LLVM

; RUN: opt -S -mergefunc < %s | FileCheck %s
; After the merge of test5 and test6, we can merge test3 and test4,
; then test1 and test2.
; CHECK: define void @test6() unnamed_addr
; CHECK-NEXT: tail call void @test5()
; 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 @test5()
call void @test5()
ret void
}
define void @test4() unnamed_addr {
call void @test6()
call void @test6()
ret void
}
define void @test5() unnamed_addr {
call void @dummy()
call void @dummy()
ret void
}
define void @test6() unnamed_addr {
call void @dummy()
call void @dummy()
ret void
}