diff options
Diffstat (limited to 'test/Transforms/DeadArgElim/deadretval2.ll')
-rw-r--r-- | test/Transforms/DeadArgElim/deadretval2.ll | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/test/Transforms/DeadArgElim/deadretval2.ll b/test/Transforms/DeadArgElim/deadretval2.ll new file mode 100644 index 000000000000..316d7555e927 --- /dev/null +++ b/test/Transforms/DeadArgElim/deadretval2.ll @@ -0,0 +1,59 @@ +; RUN: llvm-as < %s | opt -deadargelim -die | llvm-dis > %t +; RUN: cat %t | not grep DEAD +; RUN: cat %t | grep LIVE | count 4 + +@P = external global i32 ; <i32*> [#uses=1] + +; Dead arg only used by dead retval +define internal i32 @test(i32 %DEADARG) { + ret i32 %DEADARG +} + +define internal i32 @test2(i32 %DEADARG) { + %DEADRETVAL = call i32 @test( i32 %DEADARG ) ; <i32> [#uses=1] + ret i32 %DEADRETVAL +} + +define void @test3(i32 %X) { + %DEADRETVAL = call i32 @test2( i32 %X ) ; <i32> [#uses=0] + ret void +} + +define internal i32 @foo() { + %DEAD = load i32* @P ; <i32> [#uses=1] + ret i32 %DEAD +} + +define internal i32 @id(i32 %X) { + ret i32 %X +} + +define void @test4() { + %DEAD = call i32 @foo( ) ; <i32> [#uses=1] + %DEAD2 = call i32 @id( i32 %DEAD ) ; <i32> [#uses=0] + ret void +} + +; These test if returning another functions return value properly marks that +; other function's return value as live. We do this twice, with the functions in +; different orders (ie, first the caller, than the callee and first the callee +; and then the caller) since DAE processes functions one by one and handles +; these cases slightly different. + +define internal i32 @test5() { + ret i32 123 +} + +define i32 @test6() { + %LIVE = call i32 @test5() + ret i32 %LIVE +} + +define i32 @test7() { + %LIVE = call i32 @test8() + ret i32 %LIVE +} + +define internal i32 @test8() { + ret i32 124 +} |