Matthijs Kooijman | 1e0eea1 | 2008-06-24 16:30:26 +0000 | [diff] [blame] | 1 | ; RUN: llvm-as < %s | opt -deadargelim -die | llvm-dis > %t |
| 2 | ; RUN: cat %t | not grep DEAD |
| 3 | ; RUN: cat %t | grep LIVE | count 4 |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 4 | |
Tanya Lattner | 4c4d0b8 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 5 | @P = external global i32 ; <i32*> [#uses=1] |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 6 | |
Tanya Lattner | 4c4d0b8 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 7 | ; Dead arg only used by dead retval |
| 8 | define internal i32 @test(i32 %DEADARG) { |
| 9 | ret i32 %DEADARG |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 10 | } |
| 11 | |
Tanya Lattner | 4c4d0b8 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 12 | define internal i32 @test2(i32 %DEADARG) { |
| 13 | %DEADRETVAL = call i32 @test( i32 %DEADARG ) ; <i32> [#uses=1] |
| 14 | ret i32 %DEADRETVAL |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 15 | } |
| 16 | |
Tanya Lattner | 4c4d0b8 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 17 | define void @test3(i32 %X) { |
| 18 | %DEADRETVAL = call i32 @test2( i32 %X ) ; <i32> [#uses=0] |
| 19 | ret void |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 20 | } |
| 21 | |
Tanya Lattner | 4c4d0b8 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 22 | define internal i32 @foo() { |
| 23 | %DEAD = load i32* @P ; <i32> [#uses=1] |
| 24 | ret i32 %DEAD |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 25 | } |
| 26 | |
Tanya Lattner | 4c4d0b8 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 27 | define internal i32 @id(i32 %X) { |
| 28 | ret i32 %X |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 29 | } |
| 30 | |
Tanya Lattner | 4c4d0b8 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 31 | define void @test4() { |
| 32 | %DEAD = call i32 @foo( ) ; <i32> [#uses=1] |
| 33 | %DEAD2 = call i32 @id( i32 %DEAD ) ; <i32> [#uses=0] |
| 34 | ret void |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 35 | } |
Matthijs Kooijman | 1e0eea1 | 2008-06-24 16:30:26 +0000 | [diff] [blame] | 36 | |
| 37 | ; These test if returning another functions return value properly marks that |
| 38 | ; other function's return value as live. We do this twice, with the functions in |
| 39 | ; different orders (ie, first the caller, than the callee and first the callee |
| 40 | ; and then the caller) since DAE processes functions one by one and handles |
| 41 | ; these cases slightly different. |
| 42 | |
| 43 | define internal i32 @test5() { |
| 44 | ret i32 123 |
| 45 | } |
| 46 | |
| 47 | define i32 @test6() { |
| 48 | %LIVE = call i32 @test5() |
| 49 | ret i32 %LIVE |
| 50 | } |
| 51 | |
| 52 | define i32 @test7() { |
| 53 | %LIVE = call i32 @test8() |
| 54 | ret i32 %LIVE |
| 55 | } |
| 56 | |
| 57 | define internal i32 @test8() { |
| 58 | ret i32 124 |
| 59 | } |