1*9880d681SAndroid Build Coastguard Worker; This test sees if return values (and arguments) are properly removed when they 2*9880d681SAndroid Build Coastguard Worker; are unused. All unused values are typed i16, so we can easily check. We also 3*9880d681SAndroid Build Coastguard Worker; run instcombine to fold insert/extractvalue chains and we run dce to clean up 4*9880d681SAndroid Build Coastguard Worker; any remaining dead stuff. 5*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -deadargelim -instcombine -dce -S | not grep i16 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine internal {i16, i32} @test(i16 %DEADARG) { 8*9880d681SAndroid Build Coastguard Worker %A = insertvalue {i16,i32} undef, i16 1, 0 9*9880d681SAndroid Build Coastguard Worker %B = insertvalue {i16,i32} %A, i32 1001, 1 10*9880d681SAndroid Build Coastguard Worker ret {i16,i32} %B 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine internal {i32, i16} @test2() { 14*9880d681SAndroid Build Coastguard Worker %DEAD = call i16 @test4() 15*9880d681SAndroid Build Coastguard Worker %A = insertvalue {i32,i16} undef, i32 1, 0 16*9880d681SAndroid Build Coastguard Worker %B = insertvalue {i32,i16} %A, i16 %DEAD, 1 17*9880d681SAndroid Build Coastguard Worker ret {i32,i16} %B 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; Dead argument, used to check if the second result of test2 is dead even when 21*9880d681SAndroid Build Coastguard Worker; it's used as a dead argument 22*9880d681SAndroid Build Coastguard Workerdefine internal i32 @test3(i16 %A) { 23*9880d681SAndroid Build Coastguard Worker %ret = call {i16, i32} @test( i16 %A ) ; <i32> [#uses=0] 24*9880d681SAndroid Build Coastguard Worker %DEAD = extractvalue {i16, i32} %ret, 0 25*9880d681SAndroid Build Coastguard Worker %LIVE = extractvalue {i16, i32} %ret, 1 26*9880d681SAndroid Build Coastguard Worker ret i32 %LIVE 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine internal i16 @test4() { 30*9880d681SAndroid Build Coastguard Worker ret i16 0 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; Multiple return values, multiple live return values 34*9880d681SAndroid Build Coastguard Workerdefine internal {i32, i32, i16} @test5() { 35*9880d681SAndroid Build Coastguard Worker %A = insertvalue {i32,i32,i16} undef, i32 1, 0 36*9880d681SAndroid Build Coastguard Worker %B = insertvalue {i32,i32,i16} %A, i32 2, 1 37*9880d681SAndroid Build Coastguard Worker %C = insertvalue {i32,i32,i16} %B, i16 3, 2 38*9880d681SAndroid Build Coastguard Worker ret {i32, i32, i16} %C 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; Nested return values 42*9880d681SAndroid Build Coastguard Workerdefine internal {{i32}, {i16, i16}} @test6() { 43*9880d681SAndroid Build Coastguard Worker %A = insertvalue {{i32}, {i16, i16}} undef, i32 1, 0, 0 44*9880d681SAndroid Build Coastguard Worker %B = insertvalue {{i32}, {i16, i16}} %A, i16 2, 1, 0 45*9880d681SAndroid Build Coastguard Worker %C = insertvalue {{i32}, {i16, i16}} %B, i16 3, 1, 1 46*9880d681SAndroid Build Coastguard Worker ret {{i32}, {i16, i16}} %C 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine i32 @main() { 50*9880d681SAndroid Build Coastguard Worker %ret = call {i32, i16} @test2() ; <i32> [#uses=1] 51*9880d681SAndroid Build Coastguard Worker %LIVE = extractvalue {i32, i16} %ret, 0 52*9880d681SAndroid Build Coastguard Worker %DEAD = extractvalue {i32, i16} %ret, 1 53*9880d681SAndroid Build Coastguard Worker %Y = add i32 %LIVE, -123 ; <i32> [#uses=1] 54*9880d681SAndroid Build Coastguard Worker %LIVE2 = call i32 @test3(i16 %DEAD) ; <i32> [#uses=1] 55*9880d681SAndroid Build Coastguard Worker %Z = add i32 %LIVE2, %Y ; <i32> [#uses=1] 56*9880d681SAndroid Build Coastguard Worker %ret1 = call { i32, i32, i16 } @test5 () 57*9880d681SAndroid Build Coastguard Worker %LIVE3 = extractvalue { i32, i32, i16} %ret1, 0 58*9880d681SAndroid Build Coastguard Worker %LIVE4 = extractvalue { i32, i32, i16} %ret1, 1 59*9880d681SAndroid Build Coastguard Worker %DEAD2 = extractvalue { i32, i32, i16} %ret1, 2 60*9880d681SAndroid Build Coastguard Worker %V = add i32 %LIVE3, %LIVE4 61*9880d681SAndroid Build Coastguard Worker %W = add i32 %Z, %V 62*9880d681SAndroid Build Coastguard Worker %ret2 = call { { i32 }, { i16, i16 } } @test6 () 63*9880d681SAndroid Build Coastguard Worker %LIVE5 = extractvalue { { i32 }, { i16, i16 } } %ret2, 0, 0 64*9880d681SAndroid Build Coastguard Worker %DEAD3 = extractvalue { { i32 }, { i16, i16 } } %ret2, 1, 0 65*9880d681SAndroid Build Coastguard Worker %DEAD4 = extractvalue { { i32 }, { i16, i16 } } %ret2, 1, 1 66*9880d681SAndroid Build Coastguard Worker %Q = add i32 %W, %LIVE5 67*9880d681SAndroid Build Coastguard Worker ret i32 %Q 68*9880d681SAndroid Build Coastguard Worker} 69