; RUN: opt -deadargelim -S < %s | FileCheck %s define void @test(i32) { ret void } define void @foo() { call void @test(i32 0) ret void ; CHECK-LABEL: @foo( ; CHECK: i32 undef } define void @f(i32 %X) { entry: tail call void @sideeffect() nounwind ret void } declare void @sideeffect() define void @g(i32 %n) { entry: %add = add nsw i32 %n, 1 ; CHECK: tail call void @f(i32 undef) tail call void @f(i32 %add) ret void } define void @h() { entry: %i = alloca i32, align 4 store volatile i32 10, i32* %i, align 4 ; CHECK: %tmp = load volatile i32, i32* %i, align 4 ; CHECK-NEXT: call void @f(i32 undef) %tmp = load volatile i32, i32* %i, align 4 call void @f(i32 %tmp) ret void } ; Check that callers are not transformed for weak definitions. define weak i32 @weak_f(i32 %x) nounwind { entry: ret i32 0 } define void @weak_f_caller() nounwind { entry: ; CHECK: call i32 @weak_f(i32 10) %call = tail call i32 @weak_f(i32 10) ret void } %swift_error = type opaque define void @unused_swifterror_arg(%swift_error** swifterror %dead_arg) { tail call void @sideeffect() nounwind ret void } ; CHECK-LABEL: @dont_replace_by_undef ; CHECK-NOT: call void @unused_swifterror_arg({{.*}}undef) define void @dont_replace_by_undef() { %error_ptr_ref = alloca swifterror %swift_error* store %swift_error* null, %swift_error** %error_ptr_ref call void @unused_swifterror_arg(%swift_error** %error_ptr_ref) ret void }