1; RUN: opt < %s -passes=deadargelim -S | FileCheck %s 2 3@g0 = global i8 0, align 8 4 5; CHECK-NOT: DEAD 6 7; Dead arg only used by dead retval 8define internal i32 @test(i32 %DEADARG) { 9 ret i32 %DEADARG 10} 11 12define i32 @test2(i32 %A) { 13 %DEAD = call i32 @test( i32 %A ) ; <i32> [#uses=0] 14 ret i32 123 15} 16 17define i32 @test3() { 18 %X = call i32 @test2( i32 3232 ) ; <i32> [#uses=1] 19 %Y = add i32 %X, -123 ; <i32> [#uses=1] 20 ret i32 %Y 21} 22 23; The callee function's return type shouldn't be changed if the call result is 24; used. 25 26; CHECK-LABEL: define internal ptr @callee4() 27 28define internal ptr @callee4(ptr %a0) { 29 ret ptr @g0; 30} 31 32declare void @llvm.objc.clang.arc.noop.use(...) 33 34; CHECK-LABEL: define ptr @test4( 35; CHECK: tail call ptr @callee4() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ] 36 37define ptr @test4() { 38 %call = tail call ptr @callee4(ptr @g0) [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ] 39 call void (...) @llvm.objc.clang.arc.noop.use(ptr %call) 40 ret ptr @g0 41} 42 43declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr) 44